leetcode之Sum of Two Integers(371)

題目:

不使用運算符 + 和 - ,計算兩整數 ​​​​​​​a 、b ​​​​​​​之和。

示例 1:

輸入: a = 1, b = 2
輸出: 3

示例 2:

輸入: a = -2, b = 3
輸出: 1

C代碼:

int getSum(int a, int b) {
    int sum = 0,carry = 0;
    while(b)
    {
        sum = a ^ b;
        carry = (a & b) << 1;
        a = sum;
        b = carry;
    }
    return a;   
}

Python代碼1:

class Solution:
    def getSum(self, a, b):
        MAX = 0x7FFFFFFF
        MIN = 0x80000000
        mask = 0xFFFFFFFF
        while b != 0:
            a, b = (a ^ b) & mask, ((a & b) << 1) & mask
        return a if a <= MAX else ~(a ^ mask)

Python代碼2:

class Solution(object):
    def getSum(self, a, b):
        l = [a,b]
        return sum(l)

心得:此題考查的是位運算的知識,由於Python不是固定的32位,所以實現起來稍微繁瑣,Python1的思路和C的思路是一樣的,關於位運算實現相加的算法,先舉一個十進制加法的例子,比如45+67=112,如果不考慮進位得到的結果是2,只考慮進位得到的結果是110,加起來正好是112,對於二進制其實也是這樣的,因此我們可以將加操作和進位操作分開,二進制不進位加法其實就是異或操作,而進位操作實際上就是兩個數對應位都爲1時的左移,考慮到進位次數有限,當進位爲0時,加出來的就是答案了。Python代碼2只是滿足題意的一個代碼,不作爲算法練習使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章