思路
求1+2+…+n,首先想到的便是:
- for循环至n,逐项求和(需要用for循环)
- 用等差数列求和公式(需要用乘除法、条件判断语句)
题目中要求“不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)”,以往的学习积累中想到:
- for循环可以用递归实现(着重练习递归)
- 位运算符的左右移可以实现加减乘除:用位运算实现四则运算之加减乘除
- 逻辑运算符
&&
、||
具有短路的性质:一分钟搞懂逻辑运算符&(并且) , |(或者) , !(非) , ^(异或) , &&(短路与) , ||(短路或)之间的关系
{ 表 达 式 1 & & 表 达 式 2 表达式1若为false则表达式2不进行计算直接返回false 表 达 式 1 ∣ ∣ 表 达 式 2 表达式1若为true则表达式2不进行计算直接返回true \begin{cases} 表达式1\&\& 表达式2 &&&\text{表达式1若为false则表达式2不进行计算直接返回false} \\表达式1||表达式2 &&&\text{表达式1若为true则表达式2不进行计算直接返回true} \end{cases} {表达式1&&表达式2表达式1∣∣表达式2表达式1若为false则表达式2不进行计算直接返回false表达式1若为true则表达式2不进行计算直接返回true
但其实还是不知道该怎么做…略一遍题解发现是用逻辑运算符实现递归,直到条件为flase时就不再计算。
1. 递归
class Solution {
public int sumNums(int n) {
boolean flag = n>0 && (n+=sumNums(n-1))>0;
return n;
}
}
2. 等差数列求和公式
利用等差数列求和公式 S = n × ( n + 1 ) 2 {S}=\frac{n\times(n+1)}{2} S=2n×(n+1),其中除以2的操作可用右移一位代替,乘法同样用位运算解决。
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;
}
}