题目:
// 输入一个整数N 输出所有和为N的连续正数序列
// 列如: 输入15
// 输出[[1,2,3,4,5],[4,5,6],[7,8]]
console.log(func(15))
function func(n) {
let resultArr = [],
tempArr = []
if (n <= 2) return resultArr
for (let i = 1; i <= (n - 1) / 2; i++) {
for (let j = i + 1; j <= (n + 1) / 2; j++) {
tempArr = createArr(i, j)
if (sumArr(tempArr) === n) {
resultArr.push(tempArr)
} else if (sumArr(tempArr) > n) {
break
}
}
}
return resultArr
// 创建p到q的连续数组
function createArr(p, q) {
let arr = []
for (let i = p; i <= q; i++) {
arr.push(i)
}
return arr
}
// 求数组和
function sumArr(arr) {
return arr.reduce((sum, num) => {
return sum + num;
})
}
}
接下来性能性能优化一下
优化:每次都要创建一个数组和数组求和的方法,采用等差数列求和的方式,性能能提高不少
console.log(func(15))
function func(n) {
let resultArr = []
if (n <= 2) return resultArr
for (let i = 1; i <= (n - 1) / 2; i++) {
for (let j = i + 1; j <= (n + 1) / 2; j++) {
// 等差数列求和
let sum = (j+1-i)*(i+j)/2
if (sum === n) {
resultArr.push(createArr(i, j))
} else if (sum > n) {
break
}
}
}
return resultArr
// 创建p到q的连续数组数组
function createArr(p, q) {
let arr = []
for (let i = p; i <= q; i++) {
arr.push(i)
}
return arr
}
}