字节挑动算法,输入一个整数N 输出所有和为N的连续正数序列

215 阅读1分钟

题目:

// 输入一个整数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
	}
}