剑指offer题解汇总
https://blog.csdn.net/guliguliguliguli/article/details/126089434
题目链接
题目
思路
计算机的数字由二进制表示,我们平常的运算是对整个数字进行运算,但是还可以按照二进制的每一位分别进行运算。常见运算有位与、位或、移位、位异或等。
都是二进制的情况下:
按位与:都是1的时候,位与结果为1,其余结果为0
按位或:只要有一个是1,位或结果就是1
按位异或:相同的时候是0,不相同的时候是1
向右移位 >>:右移多少位相当于乘以2的多少次方
向左移位 <<:左移多少位相当于除以2的多少次方(不要余数)
无符号右移 >>>:不管是正数还是负数,都是前补0。这里以-5为例子进行讲解,通过无符号右移,负数变正数
题目中要求:不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
不能使用循环,只能一个一个加了,可以使用递归的方式。写递归最重要的就是递归的终止条件。可以采用与运算
的短路操作
: 在函数中,如果与运算成立,则继续,否则终止函数直接返回false。
下面这两段段代码表达的意思是一样的,不过因为题目不能使用if来判断,就需要使用&&运算符。只有n>=1成立的时候,&&运算符后面的代码才会被执行,否则,直接就会返回false,直接忽略&&之后的一切内容。这种方式也被称为与运算的短路操作
。
(n > 1) && (n = n + Sum_Solution(n - 1)) > 0
if (n > 1) {
n += Sum_Solution(n - 1);
}
return 1;
代码
import java.util.*;
public class Solution {
public int Sum_Solution(int n) {
boolean b = ((n > 1) && (n = n + Sum_Solution(n - 1)) > 0);
return n;
}
}