codewars练习(javascript)-2021/2/22

本文分享了在Codewars平台上解决<6kyu>SumsofParts问题的JavaScript实践过程,从超时解决方案到优化使用reduce和map,最终找到时间复杂度较低的正确答案。通过代码示例和逐步改进,适合学习者参考和提升算法技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

codewars-js练习

2021/2/22

github 地址

my 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>

以上为自己思路供大家参考,可能有更优的思路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值