前言
LeetCode确实是改变了我的解题思维
&& 短路实现 阶乘
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
实现思路:
题目控制了诸多循环的关键字,那么就要递归写
(虽然递归性能不如循环)
A && B 运算符有短路特性
A为true,还要运算B,那么把A当做循环里的判断语句,B为循环的方法体,执行n=n+(n-1),修改n值
A为false,直接跳过B,实现代码结束
Java里必须满足AB为boolean值
具体实现:
public static int test(int n){
boolean b=(n > 0) && ((n += test(n - 1)) > 0);
return n;
}
逻辑运算实现加法
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
实现思路:
在二进制中,一位只有0 和 1 ,逻辑运算也是通过判断0,1(true/false),就可以使用逻辑运算替代加法
在二进制加法:0+0=0,1+0=1,而1+1=10(最后一位是0)
这就想到了逻辑运算中的异或:a异或b,a、b相同为0(false),a、b不同为1(true),只是异或没有判断进位;
而进位类似与运算:a与b,只有a、b都为1才得1,但是与只得到了1,还要左移一位 << 1;
那么 进位+余数 不就是加法了吗,“进位”“余数”又是a,b,新一轮的加法,直到没有进位就结束
具体实现:
public static int add(int a, int b){
while (b != 0) {
int temp = a ^ b; //相加各位的值
b = (a & b) << 1; //计算进位的值
a = temp; //让a作为temp(相加各位的值的结果),再和b(进位)去异或,就是相加操作,只要进位不为0,这个循环就一直进行下去
}
return a;
}