考基本功了,工作之后才知道为什么校招的时候各个公司都喜欢面点算法。看源码的时候你会发现,基础功的重要性。
上图上思路。既然不能用四则运算,想到按位异或来操作。看源码的时候发现很少有四则运算,都是位运算。比较计算机是识别二进制,位运算效率更高。
思路:两个数相加,计算机中实际就是二进制的相加,分为 0+0 =0,0+1=1, 1+1=0 的情况。
这样看来计算分两部:1、不考虑进位的情况。 其实就是按位异或
2、考虑到进位情况,就是与,同时要左移一位。
3、计算结束返回结果条件,进位为0时,只需要按位异或计算即可。
下图以 6 + 7 为例,展示运算过程。 6==》0110 7=》0111
上代码:
int addTwoNum(int a,int b){
if(a == 0){
return b;
}
if(b==0){
return a;
}
int newA = a ^ b; //不进位情况
int newB = (a & b)<<1; //进位情况,当不为0需要左移一位。为0时,递归结束
return addTwoNum(newA,newB);
}