一、题目
题目链接:力扣
求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
限制:
1 <= n <= 10000
二、题解
1、思路
首先我们梳理题目要求。题目要求我们不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句,因此我们手里能用的工具很少,列举出来发现只有加减法、赋值、位运算符以及逻辑运算符。
🎨 递归
如果没有限制:
class Solution {
public:
int sumNums(int n) {
return n == 0 ? 0 : n + sumNums(n - 1);
}
};
但是我们不能使用if判断语句和三目运算符,怎么办呢?
我们可以利用逻辑运算符的短路特性。
🎨 隐式乘法
不希望我用求和公式,但其实我还是可以用的。我可以让操作系统隐式的为我调用乘法。有点耍赖,但是并且没有违规。至于官解的法2,我觉得有点扯。--力扣
2、代码实现
🎨 递归
class Solution {
public:
int sumNums(int n) {
n && (n += sumNums(n-1));
// 相当于
// if(n == 0)return 0;
// else return n += sumNums(b-1);
return n;
}
};
第三次的写法:
class Solution {
public:
int sumNums(int n) {
// if(n == 0)return 0;
// return n + sumNums(n-1);
int res = 0;
n&&(res = n + sumNums(n-1));
return res;
}
};
🎨 隐式乘法
class Solution {
public:
int sumNums(int n) {
bool temp[n][n+1];
return sizeof(temp) >> 1;// n*(n+1)/2
}
};
3、复杂度分析
🎨 递归
时间复杂度:O(n);
空间复杂度:O(n)。
🎨 隐式乘法
时间复杂度:O(1);
空间复杂度:O(n^2)。平方
4、运行结果
🎨 递归
🎨 隐式乘法