Skip to main content

Command Palette

Search for a command to run...

LeetCode Solution, Easy, 67. Add Binary

加總二進制數值

Published

I am not a programmer just a leaner. Writing JavaScript, Python, and Go and doing something on Kubernetes.

67. Add Binary

題目敘述

Given two binary strings a and b, return their sum as a binary string.

Example 1:

Input: a = "11", b = "1"
Output: "100"

Example 2:

Input: a = "1010", b = "1011"
Output: "10101"

Constraints:

  • 1 <= a.length, b.length <= 10**4
  • a and b consist only of '0' or '1' characters.
  • Each string does not contain leading zeros except for the zero itself.

題目翻譯

有兩個 Binary 的字串 ab,需要回傳其加總後的 Binary 字串。

解法解析

這題如果只是當純的將字串轉換成數值,很容易遇到一個問題就是會超出數值資料格式的範圍。可能就會需要使用到 BigInt 或類似 Long 的資料格式。所以比較好的方式是針對各個 Bit 作處理。

Bit-by-Bit Computation

這個解法很單純,就像是數值相加一樣,從個位數開始加,紀錄需要進位的值。

NM 分別是 ab 的字串長度 時間複雜度:O(max(N,M)) 空間複雜度:O(max(N,M))

Bit Manipulation

這解法主要使用了 Bitwise operator 來做處理。相加的話可以使用 XOR 來做處理,而是否需要進位的話則可以使用 ANDLeft shift 來處理。但是這個解法就會需要 Big Int 或是 Long 的資料型態。所以如果程式語言沒有支援的話,就不適合使用此解法。

NM 分別是 ab 的字串長度 時間複雜度:O(N+M) 空間複雜度:O(max(N,M))

解法範例

Go

Bit-by-Bit Computation

func addBinary(a string, b string) string {
    i, j, res, carry := len(a)-1, len(b)-1, "", 0
    for i >= 0 || j >= 0 {
        if i >= 0 {
            carry += int(a[i] - '0')
            i--
        }
        if j >= 0 {
            carry += int(b[j] - '0')
            j--
        }
        res = strconv.Itoa(carry%2) + res
        carry /= 2
    }
    if carry == 1 {
        return "1" + res
    }
    return res
}
Bit Manipulation
func addBinary(a string, b string) string {
    var x, _ = new(big.Int).SetString(a, 2)
    var y, _ = new(big.Int).SetString(b, 2)

    var sum = new(big.Int)
    var carry = new(big.Int)
    for y.Text(2) != "0" {
        sum.Xor(x, y)
        carry.And(x, y).Lsh(carry, 1)
        x.Set(sum)
        y.Set(carry)
    }
    return x.Text(2)
}

JavaScript

Bit-by-Bit Computation

/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function (a, b) {
    const N = a.length,
        M = b.length;
    let r = '';
    let carry = false;
    for (let i = 0; i < Math.max(N, M); i++) {
        const da = a[N - i - 1] === '1',
            db = b[M - i - 1] === '1';

        const sum = (da !== db) !== carry;
        r += (sum ? '1' : '0');
        carry = (da && carry) || (db && carry) || (da && db);
    }

    return carry ? `1${r}` : r;
};
Bit Manipulation
/**
 * @param {string} a
 * @param {string} b
 * @return {string}
 */
var addBinary = function (a, b) {
    return (BigInt(`0b${a}`) + BigInt(`0b${b}`)).toString(2);
};

Kotlin


PHP

Bit-by-Bit Computation

class Solution
{

    /**
     * @param String $a
     * @param String $b
     * @return String
     */
    function addBinary($a, $b)
    {
        $n = max(strlen($a), strlen($b));
        $a = str_pad($a, $n, '0', STR_PAD_LEFT);
        $b = str_pad($b, $n, '0', STR_PAD_LEFT);
        $carry = 0;
        $answer = array();
        for ($i = $n - 1; $i >= 0; $i--) {
            if ($a[$i] == '1') {
                $carry++;
            }
            if ($b[$i] == '1') {
                $carry++;
            }

            $answer[] = strval($carry % 2);
            $carry = floor($carry / 2);
        }

        if ($carry == 1) {
            $answer[] = '1';
        }
        $answer = array_reverse($answer);
        return implode('', $answer);
    }
}
Bit Manipulation

Python

Bit-by-Bit Computation

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        n = max(len(a), len(b))
        a, b = a.zfill(n), b.zfill(n)

        carry = 0
        answer = []
        for i in range(n - 1, -1, -1):
            if a[i] == '1':
                carry += 1
            if b[i] == '1':
                carry += 1

            answer.append(str(carry % 2))
            carry //= 2

        if carry == 1:
            answer.append('1')
        answer.reverse()
        return ''.join(answer)
Bit Manipulation
class Solution:
    def addBinary(self, a: str, b: str) -> str:
        x, y = int(a, 2), int(b, 2)
        while y:
            x, y = x ^ y, (x & y) << 1
        return bin(x)[2:]

Rust


Swift


More from this blog

如何開始入門軟體工程領域 - 名詞解釋(長期更新)

現在應該開始有很多人想要踏入軟體工程的領域,但在進入這個領域之前,覺得先了解一些名詞,可以在入門時更有方向也更知道要用什麼關鍵字去找尋有用的資訊。這篇文章就是想要幫助想要入門的人理解一些軟體工程裡的專有名詞。 作業系統 這一區塊主要解釋跟作業系統層面相關的名詞 英文中文解釋 Operation system 簡稱 OS | 作業系統 | 就是電腦的作業系統,是三大作業系統分別是:Linux、Windows、macOS | | Linux | | 自由和開放原始碼的 UNI...

May 10, 2023

我的 MacBook Pro (Apple Silicon) 設定

現在開始因為 ChatGPT 的出現,各種 AI 助手的功能都跑出來了。想想自己用了許久的環境設定也應該要來重新審視和建立新的開發環境了,僅此紀錄我個人的環境配置步驟和設定。 環境前置步驟 還原 MacBook Pro 至全新環境 macOS(全部資料刪除) 設定好初始設定後,登入 Apple ID 進入 App Store 確定 macOS 版本和預設 APP 都更新到最新 macOS 版本 到系統設定調整所有設定至個人習慣的設定 三指拖移 觸控板手勢開啟 防火牆開啟 輸入法設定...

Apr 25, 2023

ChatGPT 下的發展預想

從 ChatGPT 問世到現在,有許許多多的文章和討論出來。先從最早的 Google 要完蛋了,到後來的工作要被取代了,工程師失業了。 我就比較沒有想要馬上出來評論一下,我喜歡讓子彈飛一會兒。跟討論一下我自己比較在意的討論點。 Google 為什麼慢了? 結論:因為他需要更小心 很多人說 Google 怎麼被微軟搶先了一步。剛開始 Bing 說要加上 AI 的時候大家都在說 Google 怎麼慢了。我就馬上跑去看 OpenAI 的網站,靠北呀啊就 Azure 贊助的。那當然在正式上線 ChatG...

Mar 23, 2023

不工程的攻城獅

223 posts

I am not a programmer because I am not good at programming. But I do programming. Love to learn new things. An animal lover and a dancer. My oshi is 潤羽るしあ.