Javascript剑指offer41题:和为S的连续正数序列

剑指offer41题:和为S的连续正数序列

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

解体思路

1: 双向指针的移动 假如目前的值是小于sum的 需要把大指针往右移动 数组的长度加一 此时再去和sum进行比较 如果相等一切好说 如果还小就还是big++ 如果比sum大了 就需要减去small 用while循环让small向右移动n位直至小于sum 再进行重复比较
2: 中位数 设置的两个指针 small 和 end 整个只需要遍历small<中位数的即可 因为如果大于中位数 那么即便只有两个数相加 也一定大于sum
3:大数组里嵌套小数组 就可以外边定义一个result 里边函数定义temp
temp.push[i]
result.push[temp]
4:因为有可能big === small 所以会有[ [ 1, 2 ], [ 3 ] ]的情况 我的解决办法是往getArray函数里加入
if(small === big){
return false
}
5:答案里还对result进行了一个排序
result.sort(function(a,b){return a[0] - b[0];});
意思就是把小数字开头的数组放在前边 我觉得不是很有必要 代码也AC通过了
? 我记得有一个可以生成数组的副本的 忘记是什么了

代码

function FindContinuousSequence(sum){if(sum < 3){return [];}var small = 1var big =  2var curr = big+smallvar mid = (1+sum)/2var result = []while(small<mid){if(curr === sum){getArray(small,big)} while(curr > sum){curr-=smallsmall++if(curr === sum){getArray(small,big)}}big++curr+=big}return resultfunction getArray(small,big){var temp = []if(small === big){return false}for(var i = small;i<=big;i++){temp.push(i)}result.push(temp)}}
console.log(FindContinuousSequence(3))


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部