首页 文章

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

提问于
浏览
0

我正在对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 回答

  • 1

    使用排序数组

    arr.sort(function (a, b) { return a - b })
    
  • 1

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

    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 不仅仅是将最低值加到最大值来尝试匹配它 .

  • 1

    解决问题的可能示例 .

    这是如何工作的:首先对所有项目进行排序将第一个元素转换为最大元素使用简化数组调用递归函数y,最大值和一个变量,该变量为成功添加的项目保存一个空数组 . 递归函数基本上分两部分进行测试,如果剩余的和为零,如果是,则实现结果并返回true,从而完成函数 . 如果不遍历数组并从数组中复制从splice Test的位置获取值,如果值小于或等于剩余的和y与短数组的调用结果,sum减去值和包含已使用项目和实际项目的新数组 . 如果true返回true并完成功能 . 如果没有完成则返回false .

    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]));
    
  • 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
    

相关问题