We'll pass you an array of two numbers.
Return the sum of those two numbers and all numbers between them.
The lowest number will not always come first.
他们建议使用Math.max(), Math.min(), Array.reduce()
,但是我开始尝试使用不使用任何这些方法的解决方案 - 但很快就发现也许我应该有,因为我的版本看起来有点笨拙。
function sumAll(arr){
var index0 = arr[0], index1 = arr[1], counter = 0, sum = 0, val;
if(index0 < index1){
counter += index0;
while(counter <= index1){
val = index0++;
sum += val;
counter++;
}
} else if(index0 > index1){
counter = 1;
counter += index0;
while(counter >= index1){
val = index1 + 1;
sum += val;
counter--;
}
}
return sum;
}
基本上,这可以在您尝试时保存:
sumAll([10, 5]) //I get 42, rather than 45
所以我的两个问题如下:
我是否正确的事实是它变得笨重? 我应该使用推荐的上述方法吗? 当我开始工作的时候,我觉得我很兴奋,但是现在我觉得我要在另一个潜在的条件下进入一个兔子洞。
提前致谢!
答案 0 :(得分:4)
这是一个更快的版本,它利用了您不必在序列中实际添加每个序列号的事实,但您可以根据起点和终点计算该总和:
var ps = ActiveDocument.PageSetup;
ps.Orientation = Word.WdOrientation.wdOrientPortrait;
ps.TopMargin = (float)(0.98 * 72);
ps.BottomMargin = (float)(0.98 * 72);
ps.LeftMargin = (float)(0.92 * 72);
而且,这是一个试验台:https://jsfiddle.net/jfriend00/rh75gesc/,它将它与传统的老式方法进行了比较。
对于纯粹的性能(不是代码简洁),最好只比较两个值,而不是进行两个函数调用:
function sumAll(args) {
var min = Math.min.apply(Math, args),
max = Math.max.apply(Math, args);
return min + ((max - min) * ((max + min + 1) / 2));
}
如果你针对@NenadVracar答案进行测试并包含一些大范围,那么最后一个版本的速度要高出100倍。范围越长,速度差越大。即使是短距离,它也要快3-4倍。这里的定时测试:https://jsfiddle.net/jfriend00/5daztnky/。
这是一个稍微快一点的版本:
function sumAllFaster(args) {
var min, max;
if (args[0] < args[1]) {
min = args[0];
max = args[1];
} else {
min = args[1];
max = args[0];
}
return min + ((max - min) * ((max + min + 1) / 2));
}
答案 1 :(得分:2)
您可以使用php
,min
和一个max
loop
答案 2 :(得分:2)
这是一个有点慢的版本,但它在ES6中,很酷
57 1811
62 630
71 613
53 217
59 185
68 88
52 70
Name: hospitalized, dtype: int64
答案 3 :(得分:1)
我非常肯定,在说“数字数组”时,他/她并不是指包含这两个数字的数组对象。所以我为你提供这个Spartan JS:
function sum_range(x,y){ return( 1 + ( x < y ? y - x : x - y ) ) * (x + y) / 2; }
p.s。:可以在我的FB时间线上找到。
但即便如此,你可以放心,假设的数组只包含两个范围的外围数字;
所以它都是一样的。改变是将参数传递给函数的方式,例如:
console.log( sum_range( arr[0], arr[1] ) );
v.s:
console.log( sum_range( 10, 5 ) );
答案 4 :(得分:0)
解决这个问题的直观方法是:
这样的事情:
sumAll = function(arr) {
var low_bound = Math.min.apply(Math, arr);
var up_bound = Math.max.apply(Math, arr);
result = 0;
for (i=low_bound;i<=up_bound;i++){
result += i;
}
return result
}