https://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215?tpId=13&tqId=11201&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
| 日期 | 是否一次通過 | comment |
|----|----|----|
|2019-01-26 13:20|N|對位運算理解不夠:異或表示非進位的加法,與表示進位|
|2019-01-27 13:20|N|遞歸方法沒寫好|
題目:寫一個函數,求兩個整數之和绰沥,要求在函數體內不得使用+昔期、-、*、/四則運算符號。
解法:
對于二進制的加法運算,若不考慮進位凿可,則 1+1=0,1+0=1授账,0+1=1矿酵,0+0=0,不難發(fā)現矗积,結果等同于異或運算
全肮。因而排除進位,加法可用異或來實現棘捣。然后考慮進位辜腺,0+0 進位為 0,1+0 進位為 0乍恐,0+1 進位為 0评疗,1+1 進位為1,結果等同于與運算
茵烈。
1. 遞歸
public class Solution {
public int Add(int num1,int num2) { // (結果百匆,進位)
if((num1 & num2) == 0) {
return num1 ^ num2;
}
return Add(num1 ^ num2, (num1 & num2) << 1); // 注意下符號優(yōu)先級,移位的優(yōu)先級高于與
}
}
2.非遞歸
public class Solution {
public int Add(int num1,int num2) {
while(num2 != 0) {
int num = num1 ^ num2;
int carry = (num1 & num2)<<1;
num1 = num;
num2 = carry;
}
return num1;
}
}