首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript -置换删除重复的元素

Javascript -置换删除重复的元素
EN

Stack Overflow用户
提问于 2017-03-12 04:10:49
回答 2查看 280关注 0票数 4

这是在堆栈中找到的,但我想要一些更改。

代码语言:javascript
复制
    function perms(data) {
    if (!(data instanceof Array)) {
        throw new TypeError("input data must be an Array");
    }

    data = data.slice();  // make a copy
    var permutations = [],
        stack = [];

    function doPerm() {
        if (data.length == 0) {
            permutations.push(stack.slice());
        }
        for (var i = 0; i < data.length; i++) {
            var x = data.splice(i,1);
            stack.push(x);
            doPerm();
            stack.pop();
            data.splice(i, 0, x);
        }
    }

    doPerm();
    return permutations;
}

var input = "552".split('');
var result = perms(input);
for (var i = 0; i < result.length; i++) {
    result[i] = result[i].join('-');
}

其结果是:

5-5-2

5-2-5

5-5-2

5-2-5

2-5-5

2-5-5

但是,有3个元素重复,结果肯定是:

5-5-2

5-2-5

2-5-5

我怎样才能解决这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-12 04:45:33

基本上,你有一个问题,

代码语言:javascript
复制
var x = data.splice(i, 1)[0];
//                       ^^^ is missing

因为你得到了一个拼接的数组。结果是一个深度嵌套的数组,

代码语言:javascript
复制
data.splice(i, 0, x);

这会稍后在位置i上插入数组。

为了防止重复,您需要检查实际值是否已经插入到结果集中

代码语言:javascript
复制
permutations.some(function (a) {
    return a.every(function (b, j) {
        return stack[j] === b;
    });
}) || permutations.push(stack.slice());

这将测试数组,如果不匹配,则执行推送。

代码语言:javascript
复制
function perms(data) {
    if (!(data instanceof Array)) {
        throw new TypeError("input data must be an Array");
    }

    data = data.slice(); // make a copy
    var permutations = [],
        stack = [],
        hash = Object.create(null);

    function doPerm() {
        if (data.length == 0) {
            permutations.some(function (a) {
                return a.every(function (b, j) {
                    return stack[j] === b;
                });
            }) || permutations.push(stack.slice());
            return;
        }
        for (var i = 0; i < data.length; i++) {
            var x = data.splice(i, 1)[0];
            stack.push(x);
            doPerm();
            stack.pop();
            data.splice(i, 0, x);
        }
    }

    doPerm();
    return permutations;
}

var input = "552".split('');
var result = perms(input);
for (var i = 0; i < result.length; i++) {
    result[i] = result[i].join('-');
}

console.log(result);

票数 2
EN

Stack Overflow用户

发布于 2017-03-12 04:35:58

在使用Array.prototype.some()Array.prototype.join()调用.push()之前,检查数组数组是否存在于结果数组中

代码语言:javascript
复制
function p(a, b, res) {
  var b = b || [],
    res = res || [],
    len = a.length;
  if (!len) {
    // check if `res` contains `b.join("")`  
    if (!res.length 
       || !res.some(function(n) {
            return n.join("") === b.join("")
          }))
      res.push(b)
  } else {
    for (var i = 0
        ; i < len; p(a.slice(0, i).concat(a.slice(i + 1, len))
          , b.concat(a[i]), res)
          , i++);
  }
  return res
}

var result = p("552".split(""));

result = result.map(function(res) {
  return res.join("-")
});

console.log(result);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42740080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档