剑指 Offer 64. 求 1 + 2 + … + n

124 阅读1分钟

「这是我参与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语句进行递归终止。