「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战」
描述
求
1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
- 示例 1:
输入: n = 3
输出: 6
- 示例 2:
输入: n = 9
输出: 45
- 提示
1 <= n <= 10000
解析
对于a&&b运算符,只要有a为false,后面的b就不用判断了,因为a&&b必为false。
因此我们可以利用这个特点,实现递归边界,当n>0为false的时候,后面的条件就不会判断了,也就不会进入下一层递归。
示例
class Solution {
public int sumNums(int n) {
boolean flag=n>0 && (n+=sumNums(n-1))==0;
return n;
}
}
运行结果:
执行结果:通过
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:35.3 MB, 在所有 Java 提交中击败了84.82%的用户
此外还可以使用快速乘的方法:
由等差数列求和公式我们可以知道 1 + 2 +⋯+n 等价于 n(n+1)/2 ,对于除以 22 我们可以用右移操作符来模拟,那么等式变成了 n(n+1)>>1,剩下不符合题目要求的部分即为 n(n+1),根据快速乘我们可以将两个数相乘用加法和位运算来模拟,因为题目数据范围 n 为 [1,10000],所以 n 二进制展开最多不会超过 14 位,我们手动展开 14 层代替循环即可,至此满足了题目的要求,具体实现可以参考下面给出的代码。
class Solution {
public int sumNums(int n) {
int ans = 0, A = n, B = n + 1;
boolean flag;
flag = ((B & 1) > 0) && (ans += A) > 0;
A <<= 1;
B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0;
A <<= 1;
B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0;
A <<= 1;
B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0;
A <<= 1;
B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0;
A <<= 1;
B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0;
A <<= 1;
B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0;
A <<= 1;
B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0;
A <<= 1;
B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0;
A <<= 1;
B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0;
A <<= 1;
B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0;
A <<= 1;
B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0;
A <<= 1;
B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0;
A <<= 1;
B >>= 1;
flag = ((B & 1) > 0) && (ans += A) > 0;
A <<= 1;
B >>= 1;
return ans >> 1;
}
}