LeetCode演算法題-Sum of Two Integers(Java實現)
這是悅樂書的第210次更新,第222篇原創
01 看題和準備
今天介紹的是LeetCode演算法題中Easy級別的第78題(順位題號是371)。計算兩個整數a和b的總和,但不允許使用運算子+和 - 。例如:
輸入:a = 1,b = 2
輸出:3
輸入:a = -2,b = 3
輸出:1
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 第一種解法
藉助迴圈來實現。先將a賦值給臨時變數sum,然後判斷b的正負,如果b大於0,sum就自加加,同時b自減減;反之如果b小於0,則sum就自減減,b就自加加,最後返回sum即可。
public int getSum(int a, int b) { if (a == 0) { return b; } if (b == 0) { return a; } int sum = a; if (b > 0) { while (b > 0) { sum++; b--; } } else { while (b < 0) { sum--; b++; } } return sum; }
03 第二種解法
因為題目說不許用加減運算子,所以我們需要考慮使用位運算。在做加法運算時,會產生進位的情況。先來看一個53+69例子:
如果不考慮進位做加法,可以得到12。
如果考慮進位做加法,可以得到110。
這時我們把兩數12和110加起來,就是53和69的和,122。
如果把這種考慮位、不考慮位的計算方式換成二進位制數,那麼:
如果不考慮進位做加法,0+0=0,1+0=1,0+1=1,1+1=0。這其實就是異或(^)運算,對應位不同時,取1,否則取0。
如果考慮進位做加法,0+0=0,1+0=0,0+1=0,1+1=1。這其實就是與(&)運算,相同位均為1才是1。
首先,我們可以使用a和b之間的與(&)運算來查詢進位。其次,我們可以在a和b之間使用異或(^)運算來查詢不同的位,並將其賦值給a,然後,我們將進位向左移動一個位置並將其賦值給b,直到沒有進位或b為0。最後返回a即可。
public int getSum2(int a, int b) {
if (a == 0) {
return b;
}
if (b == 0) {
return a;
}
while (b != 0) {
int carry = a&b;
a = a^b;
b = carry << 1;
}
return a;
}
04 第三種解法
我們可以將第二種解法變成遞迴的寫法。
public int getSum3(int a, int b) {
if (b == 0) {
return a;
}
return getSum3(a ^ b, (a&b) << 1);
}
05 小結
演算法專題目前已連續日更超過兩個月,演算法題文章78+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!