【问题标题】:Find Possible addition combinations in array在数组中查找可能的加法组合
【发布时间】:2014-06-03 21:31:27
【问题描述】:

解决这个问题的最佳方法是什么?我不知道如何开始。这不是作业问题,而是面试练习。

'使用 JavaScript 语言,让函数 ArrayAddition(arr) 获取存储在 arr 中的数字数组,如果数组中的任何数字组合可以相加等于数组中的最大数字,则返回字符串 true,否则返回字符串 false。例如:如果 arr 包含 [4, 6, 23, 10, 1, 3],则输出应返回 true,因为 4 + 6 + 10 + 3 = 23。数组不会为空,不会包含所有相同的元素,并且可能包含负数。 '

http://coderbyte.com/CodingArea/GuestEditor.php?ct=Array%20Addition&lan=JavaScript

【问题讨论】:

  • @GameAlchemist :cough ***hole :cough
  • 提示:数字 02^n - 1 的二进制表示对 n的所有可能子集进行编码> 元素集。正如@Bergi 指出的那样,这是一个 NP 完全问题,因此他们不能指望任何有效的东西。这并不是说您不能做一些非常聪明的事情来提高运行时的指数,而是先尝试得到一个蛮力的答案。编辑:这是假设“echo true”不是一个可接受的答案。
  • @AndyJones 你可以期待一个伪多项式解决方案。如果数字是有界的,那么很容易有效地解决
  • @AndyJones 实际上它可以在 O((B-A)*N) 中工作,其中 A 和 B 分别是数组的最小值和最大值。但是当然有了浮点,所有的希望都消失了。还有一个不错的 O(2^(n/2)) 中间相遇算法,适用于任意值

标签: javascript arrays algorithm array-algorithms


【解决方案1】:

试试这个解决方案。对于此代码,我使用此参考 github

<script type="text/javascript">

var bol=false
var arr=[4, 6, 23, 10, 1, 3]
var maxx=Math.max.apply(Math, arr);
var index = arr.indexOf(maxx);
arr.splice(index, 1);


function k_combinations(set, k) {
    var i, j, combs, head, tailcombs;
    if (k > set.length || k <= 0) {
        return [];
    }
    if (k == set.length) {
        return [set];
    }
    if (k == 1) {
        combs = [];
        for (i = 0; i < set.length; i++) {
        combs.push([set[i]]);
    }
    return combs;
    }
    combs = [];
    for (i = 0; i < set.length - k + 1; i++) {
        head = set.slice(i, i+1);
        tailcombs = k_combinations(set.slice(i + 1), k - 1);
        for (j = 0; j < tailcombs.length; j++) {
            combs.push(head.concat(tailcombs[j]));
        }
    }
    return combs;
}


function combinations(set) {
    var k, i, combs, k_combs;
    combs = [];
    for (k = 1; k <= set.length; k++) {
        k_combs = k_combinations(set, k);
        for (i = 0; i < k_combs.length; i++) {
            combs.push(k_combs[i]);
      }
    }
    return combs;
}
var result=combinations(arr)


for(z=0;z<result.length;z++){
    var tot=0
    for(c=0;c<result[z].length;c++){
        tot+=result[z][c]
    }
    if(tot===maxx){bol=true}
}

console.log(bol)


</script>

如果此解决方案不适合您的需求,我很抱歉让您浪费时间。

【讨论】:

  • @chando 我不同意排序(!)是找到数组最大值的更好方法。事实上,我会说这是一种 更糟糕 的方式,因为它更慢(线性时间与线性时间)。下次请考虑写评论而不是修改别人的代码
【解决方案2】:

试试这个解决方案。对于组合代码,我使用了这个参考github

<script>
function algorithem() {    
        var arr = [4, 6, 23, 10, 1, 3];
        arr.sort(function(a,b) { return a-b } );
        var largest = arr[arr.length-1];
        arr.pop();

         function combinations(set) {
          return (function acc(xs, set) {
            var x = xs[0];
            if(typeof x === "undefined")
              return set;
            for(var i = 0, l = set.length; i < l; ++i)
              set.push(set[i].concat(x));
            return acc(xs.slice(1), set);
          })(set, [[]]).slice(1);
        };

        function add(arr) {
                   var sum = 0;
                var len = arr.length;
              for( var j=0;j<len;j++){
                    var p = arr[j];
                    for(var i=0,sum=0; i<p.length;i++){
                        sum += p[i];
                        if(largest == sum){
                            return true;

                        }
                    }
              };
              if( j == len){return false;}
        }
        add(combinations(arr));
    };
   </script>

【讨论】:

  • 这是如何使用 jQuery 的?包括这似乎完全没用。
  • forEach 在返回 false 时不会中断?
  • try catch 在那里做什么?为什么ijmatched 是全局变量?在returning 之后你会break 吗?你到底需要matched 做什么?为什么最后一个 return 在条件内?
  • 我试图打破外循环,当最大数等于此中断的数组组合的总和时,返回与条件匹配,如果数组元素的任何组合总和不等于它返回的最大数字是 false 这就是外部循环的作用。
  • 但是你为什么不直接从函数中return 呢?
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
相关资源
最近更新 更多