【问题标题】:Array Addition I JavaScript function on CoderbyteCoderbyte 上的数组加法 I JavaScript 函数
【发布时间】:2016-03-10 07:05:28
【问题描述】:

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

给我的挑战: “使用 JavaScript 语言,具有函数 ArrayAdditionI(arr) 获取存储在 arr 中的数字数组并返回字符串 true if 数组中的任何数字组合都可以相加等于 数组中的最大数,否则返回字符串 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/

如果有任何建议,我将不胜感激。谢谢^^

【问题讨论】:

  • 你的排序是排序字符串,而不是数字。
  • 您有 JavaScript 问题还是只想让我们为您解决算法问题?
  • var max = Math.max.apply(0, arr);
  • 你为什么用result/largestNum !== 1而不是result !== largestNum
  • 您的循环只是按递增顺序添加数字。它从不尝试跳过某些数字的组合。

标签: javascript arrays


【解决方案1】:

使用排序数组

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

【讨论】:

  • 所以你可以在方法内部编写一个函数来进一步操作它们已经做了什么?
  • 是的排序方法确实具有作为参数的功能。默认 sort() 对字符串进行排序,而这个对数字进行排序。简而言之,它表明我要对字符串或数字进行排序。
  • 嗨,帕思,谢谢。是的,我明白这一点。等等,你是说不是所有方法都可以将函数作为参数吗?你能举个例子吗?或者是否可以操纵任何方法(以函数作为参数)?我想知道是否有一些关于这个的文章......
  • 顺便说一句,我知道回调和高阶函数,但这似乎不同,因为它在一个方法中......即使我知道方法也是函数......所以我想我要问的是如何我知道什么时候可以输入函数作为参数(用于方法)吗?是否所有方法都可以?
  • 这可能有助于您更好地理解。 stackoverflow.com/questions/8537602/…
【解决方案2】:

这可能还不是完整的解决方案,但这里是 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] =&gt; 4 + 6 + 10 + 3 = 23 不仅仅是将最小值与最大值相加来尝试匹配它。

【讨论】:

  • 你可以跳过1,因为它可以将一些项目求和到最大的数字。
  • 谢谢!我获得最大数量的方法还不够吗?如果是这样,你能帮我理解为什么让我下次知道吗? "var maximumNum=newArr.slice(-1);"
  • "var largeNum=newArr.slice(-1);"正在使用最后一个元素重新遍历数组。你需要这样做:“var largeNum=newArr.slice(-1)[0];” ☺
  • 感谢 CodeiSir。我从来没有见过这样使用 slice。我查找了有关它的信息,但发现了这个:stackoverflow.com/questions/19544452/…
  • 声明和解释 slice(0, -1)。
【解决方案3】:

解决问题的可能示例。

这是如何工作的:

  • 首先对所有项目进行降序排序
  • 将第一个元素移到largest
  • 调用递归函数y,使用缩减后的数组、最大值和一个变量,该变量为成功添加的项目保存一个空数组。

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

  1. 测试剩余总和是否为零,如果是则达到结果并返回true,结束函数。
  2. 如果不遍历数组和
    • 从数组中复制一份
    • splice的位置获取值
    • 测试,如果该值小于或等于剩余的总和以及使用短数组调用 y 的结果,求和减去值以及包含已使用项和实际项的新数组。
    • 如果为 true,则返回 true 并完成函数。
  3. 如果在返回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]));

【讨论】:

  • 感谢 Nina 花时间创建解决方案并写下步骤,但我并不是在寻找新的解决方案。我想弄清楚如何修复我已经拥有的东西。特别是缅族提出的跳过问题的建议。这就是我现在想要弄清楚的。
  • 问题是,您只在项目上循环一次并尝试获得一个结果,该结果至少需要一次又一次地从数组中循环其余部分,直到找到解决方案。除此之外,您尝试比较 result/largestNum !== 1 并不具有建设性,因为您不是在寻找差异,而是寻找商。
【解决方案4】:

我试图用 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

【讨论】:

    猜你喜欢
    • 2016-03-06
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    相关资源
    最近更新 更多