题目
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
示例 1:
输入: n = 3
输出: 6
示例 2:
输入: n = 9
输出: 45
限制:
- 1 <= n <= 10000
解题
主要思路:很明显等差数列,可以通过等差数列求和公式计算。
sum = n(a1 + an) / 2
但是题目要求不能用乘除法,是否有运算符可以替代乘除。除法可以用位运算的右移来代替,乘法暂时没有想到好的方法。
除了等差数列求和公式,本题还可以使用递归:
public int sumNums(int n) {
if (n == 1) return 1;
n = n + sumNums(n-1);
return n;
}
但是不能 if 关键字,那么需要找到替代品;在java的世界,还有逻辑运算符可以代替条件判断,所以可以修改为:
public int sumNums(int n) {
boolean res = n > 1 && (n+=sumNums(n-1))>0;
return n;
}
使用的是与逻辑的短路规则,如果 n > 1 为false,那么退出递归,否则执行递归。
时间复杂度:O(n)
空间复杂度:O(1) 定义常量