1. 程式人生 > 實用技巧 >leetcode刷題-67二進位制求和

leetcode刷題-67二進位制求和

題目

給你兩個二進位制字串,返回它們的和(用二進位制表示)。

輸入為 非空 字串且只包含數字1和0。

示例1:

輸入: a = "11", b = "1"
輸出: "100"

思路

位運算:

以13的二進位制為0000 1101,9的二進位制為0000 1001為例子

    1. 不考慮進位,分別對各位數進行相加:
      sum = 0000 1101 + 0000 1001 = 0000 0100

    2. 考慮進位:
      有兩處進位,第0位和第3位,只考慮進位的結果為:
      carry = 0001 0010

    3. 在步驟2中carry == 0 ?若不為0,重複步驟1 、2 、3;為0則結束,結果為sum:
      本例中,
      (a)不考慮進位sum = 0001 0110;
      (b)只考慮進位carry = 0;
      (c)carry == 0,結束,結果為sum = 0001 0110

      轉換成十進位制剛好是22

因此可以通過位運算來完成計算

實現

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        num1 = int(a,2)
        num2 = int(b,2)
        sum = num1 ^ num2;
        carry = (num1 & num2) << 1;  
        while carry != 0:
            a = sum;
            b = carry;
            sum 
= a ^ b; carry = (a & b) << 1; return bin(sum)[2:]