「这是我参与2022首次更文挑战的第41天,活动详情查看:2022首次更文挑战」。
剑指 Offer 64. 求 1 + 2 + … + n
求 1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出:6
示例 2:
输入: n = 9
输出:45
限制:
1 <= n <= 10000
思路: 一般来说,从1加到n最简单的办法莫过于首项加末项,乘以项数除以2。这是初中时期就学到的知识。 或者使用循环来实现累加。
不过根据题目要求,本题不能使用乘除法和循环语句,因此各种循环以及高斯方程都不可以使用。
但是我们可以使用加法。使用递归的方式进行累加是最容易想到的。那么下面就看看代码:
递归
/**
* @param {number} n
* @return {number}
*/
var sumNums = function(n) {
if (n === 1) return 1;
return sumNums(n - 1) + n;
};
由于题目不可以使用if语句,因此需要修改下实现。
const sumNums = (n) => {
return n > 0 && sumNums(n - 1) + n;
}
- 时间复杂度 O(n) 。
- 空间复杂度 O(n) 。
分析:
本题解使用递归 从后往前 进行累加。直到递归到第一项为止。递归的终止条件就是首项,当n === 1时,返回1。当递归进行回溯时,刚好就实现了1~n的累加。
由于不允许使用if语句,因此需要考虑使用其他逻辑判断。这次采用了 短路运算 。只有当n > 0 时,才递归进行累加。如果不满足先决条件,则返回false 。在JavaScript中,false和数值累加,false会被转为数字0。
复杂度方面,递归需要累加所有值,因此时间复杂度是O(n)。需要O(n)函数调用栈空间。
总结
本题有诸多限制,因此逻辑判断考虑使用 与运算 的 短路运算 ,代替了递归中使用if语句进行递归终止。