数组加法我在Coderbyte上的JavaScript函数

时间:2015-12-05 10:26:08

标签: javascript arrays

我正在对Coderbyte进行挑战,如果对我的问题有任何建议,我将不胜感激:

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

我试图解决它的方式:http://jsfiddle.net/reLsg0fg/

function ArrayAdditionI(arr){
  var newArr=arr.sort(); // sorted from smallest to largest.
  var largestNum=newArr.slice(-1); // Gets the last number, which would be the largest.
  var loopArr=arr.sort().pop(); // Takes out the largest number for adding later.
  var result=0;

  for(var i=0; i<loopArr.length; i++){ // loops through all numbers.
    if(result/largestNum !== 1){ //when you divide a number by itself it will be 1.
        result+=loopArr[i]; // keep adding each number until get largest number.
    }else if(result === largestNum){
    return true;
    }
  } 
  return false;
}


// TESTS    
console.log("-----");   
console.log(ArrayAdditionI([4,6,23,10,1,3]));    
console.log(ArrayAdditionI([5,7,16,1,2]));   
console.log(ArrayAdditionI([3,5,-1,8,12]));   

我应该得到真实,虚假,真实。但我得到假,假,假,好像我的循环中出现了问题。 JSFiddle:http://jsfiddle.net/reLsg0fg/

我将不胜感激任何建议。谢谢^^

4 个答案:

答案 0 :(得分:1)

使用

排序数组
arr.sort(function (a, b) { return a - b })

答案 1 :(得分:1)

这可能不是完整的解决方案,但这里是JavaScript-Problems:

largestNum是您算法中的数组 .sort()无效

function ArrayAdditionI(arr){
    var largestNum = Math.max.apply(0, arr); // Gets the last number, which would be the largest.
    arr.sort(function(a, b){return a-b})
    arr.pop(); // Takes out the largest number for adding later.
    var result=0;  

同样使用if(result !== largestNum) {,分区很昂贵,并且浮点数可能会产生意外结果。

这就是你的JavaScript。但我很确定算法是错误的 - 但我认为这取决于你

请注意,示例[4, 6, 23, 10, 1, 3] => 4 + 6 + 10 + 3 = 23不仅仅是将最低值加到最大值来尝试匹配它。

答案 2 :(得分:1)

问题解决方案的一个可能示例。

  

这是如何运作的:

     
      
  • 首先对所有项目进行排序
  •   
  • 将第一个元素移至largest
  •   
  • 使用简化数组调用递归函数y,最大值和包含成功添加项的空数组的变量。
  •   
     

递归函数基本上分两部分工作

     
      
  1. 测试剩余总和是否为零,如果是,则实现结果并返回true,完成该功能。
  2.   
  3. 如果没有遍历数组并且      
        
    • 从数组中复制
    •   
    • 使用splice
    • 从该位置获取值   
    • 测试,如果值小于或等于剩余总和以及y对短路数组的调用结果,总和减去值以及带有已使用项目和实际项目的新数组。
    •   
    • 如果true返回true并完成功能。
    •   
  4.   
  5. 如果在返回false之前没有完成。
  6.   

&#13;
&#13;
function x(array) {

    function y(a, s, result) {
        var aa, i, v;
        if (s === 0) {
            document.write('<pre>result: ' + JSON.stringify(result, 0, 4) + '</pre>');
            return true;
        }
        for (i = 0; i < a.length; i++) {
            aa = a.slice();
            v = aa.splice(i, 1)[0];
            if (v <= s && y(aa, s - v, result.concat(v))) {
                return true;
            }
        }
        return false;
    }

    var largest,
        r = [];
    array.sort(function (a, b) { return b - a; });
    largest = array.shift();
    document.write('largest value: ' + largest + '<br>');
    return y(array, largest, r);
}

document.write(x([4, 6, 23, 10, 1, 3]) + '<hr>');
document.write(x([5, 7, 16, 1, 2]) + '<hr>');
document.write(x([3, 5, -1, 8, 12]));
&#13;
&#13;
&#13;

答案 3 :(得分:0)

我试图用for循环解决这个问题,但我错过了挑战的事实   并不是要求所有数字都需要加起来等于最大数量,但也有可能   如果我们拿出一些数字,加起来就是最大的数字。因此我决定用递归来解决。

提示:
    * Math.max.apply()方法接受一个数组并返回最大的数字。请注意,它通常作为Math.max()在字符串上工作     * sort()方法可以使用参数来进一步扩展它的目的。通常它只       对字符串进行排序,但是为了对数字进行排序,我们包含一个查找哪个数字更大的函数     *首先得到最大的数字     *对数组进行排序,然后删除用于递归的最大数字     *创建一个递归函数,检查数字是否加起来最大数字,如果没有,检查数组中的某些数字是否从最大数字中减去它们等于最大数字。

function ArrayAdditionI(array){
  var largestNum = Math.max.apply(0, array); // gets the largest number in array.
  array.sort(function(a,b){ return a-b;}).pop(); // sorts array and removes last(largest) number.

  function recursionCheck(arr, sum){
  // the base case when array empty.
    if(arr.length === 0){ 
    return sum === 0;
    }

    var arrBeginNum=arr[0];  

    // for every recursion take away one number(the first one in this case).
    arr = arr.slice(1);

    // first check if numbers sum up to largest num if not, check if removing numbers adds up to largest num.
    return recursionCheck(arr, sum) || recursionCheck(arr, sum - arrBeginNum);
  }

 // recursion needs to be called for it to start.
return recursionCheck(array, largestNum);
   }

// TESTS
console.log("-----");
console.log(ArrayAdditionI([1,2,3,5,4])); ==> true
console.log(ArrayAdditionI([21,10,12,9,2])); ==> true
console.log(ArrayAdditionI([4,6,23,10,1,3])); ===> true
console.log(ArrayAdditionI([5,7,16,1,2])); ===> false
console.log(ArrayAdditionI([3,5,-1,8,12])); ===> true