codewars-js练习
2021/2/22
github 地址
【1】<6kyu>【Sums of Parts】
example:
Let us consider this example (array written in general format):
ls = [0, 1, 3, 6, 10]
Its following parts:
ls = [0, 1, 3, 6, 10]
ls = [1, 3, 6, 10]
ls = [3, 6, 10]
ls = [6, 10]
ls = [10]
ls = []
The corresponding sums are (put together in a list): [20, 20, 19, 16, 10, 0]
solution
1先应用了以下这种方法,不考虑时间复杂度,可以实现功能,但提示超时
//超时
<script type="text/javascript">
function partsSums(ls) {
// console.log(ls)
var len = ls.length;
var result = [];
for(var j=0;j<len+1;j++){
var sum = Sum(ls)
ls.shift()
// console.log(sum)
result.push(sum)
}
return result;
}
function Sum(arr){
var sum = 0
for(var i=0;i<arr.length;i++){
sum +=arr[i];
}
return sum;
}
// 验证
console.log(partsSums([]));//[0]
console.log(partsSums([0, 1, 3, 6, 10]));//[20, 20, 19, 16, 10, 0]
</script>
2因此改进了这种方法,运用了reduce,但还是提醒超时
//超时
<script type="text/javascript">
function partsSums(ls) {
// console.log(ls)
var len = ls.length;
var result = [];
for(var i=0;i<len+1;i++){
let sum = ls.reduce((a, b) => {return a + b;},0);
// console.log(sum)
result.push(sum)
ls.shift()
}
return result
}
// 验证
console.log(partsSums([]));//[0]
console.log(partsSums([0, 1, 3, 6, 10]));//[20, 20, 19, 16, 10, 0]
</script>
3 最后经过各种尝试,选择了这种。reduce map。终于提示成功
- 首先先在数组中添加一个元素0;
- 计算出起始的总和sum;
- 每次提出一个元素,并用初始sum减去该元素,算出新的当前sum;
- 将所有sum和弄成数组返回;
- end。
//最终正确答案
<script type="text/javascript">
function partsSums(ls) {
ls.unshift(0);
let sum = ls.reduce((a, b) => a + b, 0);
return ls.map(v => sum = sum - v);
}
// 验证
console.log(partsSums([]));//[0]
console.log(partsSums([0, 1, 3, 6, 10]));//[20, 20, 19, 16, 10, 0]
</script>
以上为自己思路供大家参考,可能有更优的思路。