2017-02-21 54 views
0

似乎编译器不会进入for循环。数组的总和是计算出来的。SumAll([1,4] )应该返回10(1 + 2 + 3 + 4)作为输出。计算总数,计算数组的最大值和最小值之间的数字。例如:[1,4]应该返回1 + 2 + 3 + 4 = 10

function sumAll(arr) { 
     //return Math.max.apply(Math,arr); 
     //return Math.min.apply(Math,arr); 

     // return "0"; 
     var sum=arr.reduce(function(a,b){ 
      for(var i=Math.min.apply(Math,arr);i<=Math.max.apply(Math,arr);i++){ 
     return a+b; 
     } 
     },0); 
     //return sum; 
    } 

    sumAll([1, 4]); 
+0

什么都没有返回.For循环没有得到执行。 @Rajesh – aayushi

+3

你也可以使用公式,前n个自然数之和= n *(n + 1)/ 2:P –

+0

for循环没有得到执行,因为你在第一次迭代时从它返回。 @aayushi –

回答

1

你可以尝试这样的事情:

注意:你的阵列有范围限制,所以你应该使用这些值,循环和使用i来计算总和。

样品

For循环

function getSumOfRange(arr){ 
 
    var min = Math.min.apply(null, arr) 
 
    var max = Math.max.apply(null, arr); 
 
    
 
    var sum = 0; 
 
    for(var i=min; i<= max; i++){ 
 
    sum+=i; 
 
    } 
 
    return sum; 
 
} 
 

 
console.log(getSumOfRange([1,4]))

式基于

function getSumOfRange(arr){ 
 
    var min = Math.min.apply(null, arr) 
 
    var max = Math.max.apply(null, arr); 
 
    var diff = (max-min) + 1; 
 
    var sum = (min + max); 
 
    var total = sum * Math.floor(diff/2) 
 
    return diff % 2 === 0 ? total : total + (sum/2); 
 
} 
 

 
console.log(getSumOfRange([1,4])) 
 
console.log(getSumOfRange([10,40]))


代码的解释

function sumAll(arr) { 
 
    var sum = arr.reduce(function(a, b) { 
 
    // Loop will only run once as you are returning 
 
    for (var i = Math.min.apply(Math, arr); i <= Math.max.apply(Math, arr); i++) { 
 
     // 1st Time: a=0; b=1; 
 
     // 2nd Time: a=1; b=4; 
 
     return a + b; 
 
    } 
 
    }, 0); 
 
    
 
    // Sum = 5 and not 10; 
 
    
 
    // You have commented return hence no output is given back. 
 
    //return sum; 
 
} 
 

 
sumAll([1, 4]);

+0

a和b的值在reduce()中如何变化? @rajesh – aayushi

+0

'a'将为第一次迭代保存*初始值*并且*对于其他迭代保存先前迭代的返回值。 'b'将保存元素值 – Rajesh

+0

@aayushi有关更多说明,请参阅以下[答案](http://stackoverflow.com/a/40146799/3783478)。 – Rajesh

5

你可以直接使用值从数组,而不会减少。

function sumAll(arr) { 
 
    var i, sum = 0; 
 
    for (i = Math.min.apply(null, arr); i <= Math.max.apply(null, arr); i++) { 
 
     sum += i; 
 
    } 
 
    return sum; 
 
} 
 

 
console.log(sumAll([1, 4])); 
 
console.log(sumAll([1, 3, 9]));

+0

为什么使用'Math.min.apply(null,arr)'和Math.max.apply(null,arr)? –

+0

要获得数组 – Rajesh

+0

中的最小值和最大值,它将从数组中获取最小值和最大值。 ['Function#apply'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)将一个对象和一个数组作为参数用作调用参数。 –

0

有2种方式来做到这一点。

  1. 使用数学公式n1 + (n1 + 1) + ... + n2 = n2(n2 + 1)/2 - n1(n1 - 1)/2。时间复杂度:O(1)
  2. 以编程方式。时间复杂度:为O(n)

显然,对于大范围的数字,第一种方式要快得多。

function sumAllMath(arr) { 
 
    if (!(Array.isArray(arr) 
 
     && arr.length === 2 
 
     && typeof arr[0] === 'number' 
 
     && typeof arr[1] === 'number' 
 
     && arr[0] < arr[1])) { 
 
     return; 
 
    } 
 
    
 
    var from = arr[0]; 
 
    var to = arr[1]; 
 
    return ((to * (to + 1))/2) - ((from * (from - 1))/2); 
 
} 
 

 
console.log(sumAllMath([1,4])) 
 

 
function sumAll(arr) { 
 
    if (!(Array.isArray(arr) 
 
     && arr.length === 2 
 
     && typeof arr[0] === 'number' 
 
     && typeof arr[1] === 'number' 
 
     && arr[0] < arr[1])) { 
 
     return; 
 
    } 
 
    
 
    var sum = 0; 
 
    var from = arr[0]; 
 
    var to = arr[1]; 
 
    while(from <= to) { 
 
    sum += from; 
 
    ++from; 
 
    } 
 
    
 
    return sum; 
 
} 
 

 
console.log(sumAll([1,4]))

+0

时间复杂性并不是真的'O(1)',因为您仍然需要确定数组中的最大值和最小值(您忽略了这一点),但公式绝对是您的选择! – Thilo

+0

这个问题存在误解。我明白数组总是有2个数字格式:[minNumber,maxNumber]。所以,你不必搜索数组中的数字。 – Apostolidis

+0

更重要的是,即使我们想要包括必须找出数组的极值,在数组长度上它仍然只是'O(n)',而不是数字本身的大小(就像循环一样是)。所以如果你给出数组长度的上限(比如两个......),它仍然是有效的'O(1)'。 – Thilo

3

你并不需要一个reduce,因为你没有一个数组减少。但是,您可以保留for循环并在每次迭代时通过将i添加到sum来累积总和。问题是,您:

  • 用过的,不需要减少
  • return马上出的荷兰国际集团的循环,所以,任何款项的积累存在的。

下面的代码应该是什么样子:

function sumAll(arr) { 
 

 
    var sum = 0; 
 
    for (var i = Math.min.apply(Math, arr); i <= Math.max.apply(Math, arr); i++) { 
 
    sum += i; 
 
    } 
 

 
    return sum; 
 
} 
 

 
console.log(sumAll([1, 4]));

+0

如果必须使用reduce()来完成,那么代码是什么? @Hitscotty – aayushi

+1

@aayushi:为了减少你首先需要建立'min'和'max'之间所有数字的数组。然后你可以实现'sum [1,2,3,4,5]'作为'reduce(+)0 [1,2,3,4,5]'。但这有点疯狂。 – Thilo

+0

了解!谢谢@Thilo – aayushi

1

似乎没有人愿意使用的公式为第n个自然数的总和:

function sumAll(arr) { 
    let start = Math.min.apply(Math, arr); 
    let end = Math.max.apply(Math, arr); 
    return (end * (end+1) - start * (start-1))/2; 
} 
相关问题