为了突出重点,把内容写在了前面,今天写一下面试中的经典问题之数组求和,上一篇关于查找数组元素位置的文章链接。
题目:计算给定数组 arr 中所有元素的总和
输入描述:
数组中的元素均为 Number 类型
输入例子:
sum([ 1, 2, 3, 4 ])
输出例子:
10
数组求和也是大家极为熟悉的问题,不管是在算法问题中还是实际项目中,都经常会用到这个经典问题,解决的办法有很多,这里帮大家总结一下,也是对自己的一个学习和提升:
1.既然是求和,使用递归思想:一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).
例子:
functionsum(arr) {
var len = arr.length;
if(len == 0){
return 0;
}else if (len == 1){
returnarr [0] ;
}else{
returnarr[0] + sum(arr.slice(1));
}
}
递归一直是算法思想里比较难理解的一个知识点,我们一起来看看这个函数的思路和执行步骤吧:首先定义一个sum函数,参数为求和的数组,之后定义数组元素的个数为一个变量len,为了达到求和的目的,就需要遍历数组里的每一个元素,这里采用了.slice属性取到数组中的第二个之后的元素,思考一下,对数组循环执行此方法,是不是可以将数组里的没一个数字单独取出呢?
为了达到这个目的,函数采用if条件先判断数组长度,对于没有元素的数组,返回0,一个元素的,返回元素值,对于数组大于一个的情况,循环调用自身函数,取出第一个元素,直到取出数组中的每一个元素,并求和。
2.常规循环:
如果说递归思想理解起来会有困难的话,这个方法大家应该都能想到,也比较好理解:
function sum(arr) {
var s = 0;
for (var i=0; i<=arr.length-1; i++) {
s += arr[i]; }
return s;
}
3.forEach遍历
functionsum(arr) {
var s =0;
arr.forEach(function(val) {
s += val;
});
return s;
};
运行结果:
for each遍历可以列出数组中的素一个元素,val指代当前元素。
eval法:
function sum(arr) {
return eval(arr.join("+"));
};
这个方法比较厉害,是先用.join将数组里每个元素放入字符串,并用“+”连接,eval命令则可以计算字符串,并执行其中的JS代码。不过eval会改变原词法作用域,是JS引擎优化失效,是运行变慢。所以最好少用eval。这里只是采用这个思想。
网友评论