今天有人问我,你将如何创建一个包含 N 个顺序元素的数组,如 [1,2,3,...,N]
(应该从 1 开始),其中 N
由用户提供。例如,如果 N=10,则数组将为 [1,2,3,4,5,6,7,8,9,10]
。另外,他想对元素求和,所以如果 N=10 那么结果就是 55。
我是这样做的:
console.log(new Array(10).fill(1).map((x,y)=>x+y).reduce((x,y)=>x+y))
.as-console-wrapper { max-height: 100% !important; top: 0; }
.as-console-row{background: #000;color: #fff;}
.as-console-row-code{font-size:24px!important}
我只想问一下解决同样问题的最佳方法是什么,为什么?
最佳答案
如果考虑到执行时间,您仍在寻找“best”解决方案,则以下解决方案比 Nina 发布的解决方案快 55 倍( https://jsfiddle.net/vc1wmk6e/ ):
function range (first, last) {
var range = new Array(last - first + 1); range[0] = first;
for (var i = 1; range[i - 1] < last; i++) range[i] = first + i;
return range;
}
console.log(...range(1, 10));
console.log(range(1, 10).reduce((acc, x) => acc + x));
要知道为什么它比 fill
+ map
快(大约 4.5 倍),我们需要查看这两个函数的实现以计算它们的时间复杂度.我现在还没有准备好深入研究 JS 源代码,但是 fill
和 map
都有可能遍历数组元素。在这种情况下,时间复杂度至少为 O(2N),而 range
函数为 O(N)。剩余的额外时间可能来自需要在内存中查找相应代码的函数调用,但这是一个纯粹的假设:-|
关于javascript - 按顺序填充数组并添加数组所有元素的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55128231/