【问题标题】:string addition I coderbyte completely stumped字符串加法我 coderbyte 完全难倒
【发布时间】:2014-04-24 11:14:38
【问题描述】:

谁能像 6 岁的孩子一样向我解释解决方案?我无法理解解决方案。也许一些代码 cmets?

谢谢。


我在 coderbyte 上花了 2 个小时试图解决这个问题。问题来了:

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

我已经搜索了互联网,从人们对 coderbyte 本身的回答中阅读了一堆人的解决方案,但是没有任何 cmets,我真的很难弄清楚这是如何完成的。我已经重新开始了无数次,所以我什至不确定最后一次尝试是否更好。

我知道我需要以某种方式循环并测试每个组合索引 5、索引 4、索引 3、索引 2、索引 1 以及小于所有这些的每个组合(即仅索引 5 和索引 3 )。我只是不知道该怎么做。如果我知道列表总是由 5 个数字组成的数组,并且它需要全部 5 个,我会编写 5 个循环,它们都同样嵌套在一个大循环中,对吧?但是,由于不需要所有数字并且不知道所有情况下数组的长度,这增加了复杂性,我完全被难住了。我尝试使用 Math.floor(Math.random() * array.length);生成一个数字列表......但这也不起作用。

function ArrayAdditionI(arr) { 
  var longest = arr.sort( function(a,b) { return a-b });
  var longest = longest[longest.length - 1];

  var sumArr = function (arrb) {
    var sum = 0;
    for (var z = 0; z < arrb.length; z++){
      sum += arrb[z];
    }
    return sum;
  };

  for (var i = 0; i > arr.length; i++) {
    for (var y = 0; y > arr.length; i++) {
    testArr.push(arr[i]);
    if (sumArr(testArr) === longest) {
      return true;
    }
    testArr.push(... its 4am and I'm stumped!...)
    }}


  // code goes here  
  return false; 

}

// keep this function call here 
// to see how to enter arguments in JavaScript scroll down
ArrayAdditionI(readline());           

【问题讨论】:

标签: javascript arrays


【解决方案1】:

该问题的一个相当简单易懂和常​​见的解决方案如下。它基本上是通过添加每个后续数字(循环 j)来循环遍历数组(循环 i)开始的。如果循环 j 在没有解决方案的情况下结束,则循环 k 开始并删除每个后续数字。然后 i 递增,循环重新开始。

function ArrayAdditionI(arr) { 
  arr.sort(function(a,b){return a - b})
  var largest = arr.pop();  // Set largest to last (largest) array value
  var sum = 0;
  for (var i = 0; i < arr.length; i++){     // Start outer loop 
    sum += arr[i];
    for (var j = 0; j < arr.length; j++){   // Start inner to begin sum
      if (i != j) {     // Ensure we don't add the same array index to itself
        sum += arr[j];
        console.log(sum);
        if (sum == largest) {
          return true;
        }
      }
    }
    for (var k = 0; k < arr.length; k++) {  // If no match, start 2nd loop to re-iterate removing index values
      if (i != k) {
        sum -= arr[k];
        console.log(sum);
        if (sum == largest) {
          return true;
        }
      }
    }
    sum = 0;    // Reset sum for outer loop
  }
  return false; 
}

【讨论】:

  • 不错!我今天早上刚刚添加了一个递归版本。奇怪的巧合,我已经好几个星期没有看到这个问题了。
【解决方案2】:

thefourtheye 的评论基本上告诉了你问题的名称以及在 google 上搜索的内容。

java 代码中的解决方案如下...

1) find all subsets that sum to a particular value

这是理论和伪代码。

2) How to implement the Sum of Subsets problem in Java

如果集合数 > 0,则更改代码以返回您希望的结果。

3) 修改下面代码中的GetAllSubsetByStack 以在找到集合时停止:

https://codereview.stackexchange.com/questions/36214/find-all-subsets-of-an-int-array-whose-sums-equal-a-given-target

【讨论】:

    【解决方案3】:

    在我昨晚参加的一次聚会上,我们对“MakeChange”算法进行了类似的递归。今天早上,我在几个星期没看这个问题后,用新鲜的眼光看了一下这个问题。这是我想出的。

    本质上:将数组从最大到最小排序,将其移出并将其声明为“目标”,然后通过每次递归将其切片越来越小来递归地减少数组,当数组达到 0 长度时,将原始数组随机化并再次开始减少。

    如果goal = total(即reduce)则返回true 如果我将数组随机化超过 1000 次,则返回 false。

    function ArrayAdditionI(arr) {
    
      var originalArr = arr.sort(function(a,b) {return b-a});
      var goal = arr.shift();
      var counter = 0;
    
      function randomArray(array) {
        for (var i = array.length - 1; i > 0; i -= 1){
          var j = Math.floor(Math.random() * (i + 1));
          var temp = array[i];
          array[i] = array[j];
          array[j] = temp;
        }
        return array;
      }
    
      function recurse(arr) {
        if (arr.length == 0){
          counter++
          var newArr = randomArray(originalArr);
          return recurse(newArr);
    
        } else {
    
          var total = arr.reduce(function(a,b) {return a+b});
    
          if (goal == total){
            return true
    
          } else if (counter == 1000) {
            return false 
    
           } else {
             newArr = arr.slice(1);
             return recurse(newArr);
    
    
           }
        } 
      }
    
      // code goes here  
      return recurse(originalArr); 
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2021-03-04
      • 2011-06-03
      相关资源
      最近更新 更多