1. 程式人生 > >LeetCode演算法題-Sum of Two Integers(Java實現)

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+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!