Easy草稿★★★★★O(max(m, n)) 時間 · O(max(m, n)) 空間
Bit ManipulationMathString
Patterns💡 位元技巧🧮 數學・組合
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

67Add BinaryBit ManipulationEasyBit Manipulation

給定兩個二進位字串 ab,回傳它們的和(也是二進位字串)。

Example:

Input: a = “1010”, b = “1011” Output: “10101”

Intuition

TIP

核心思路:模擬二進位加法——從最低位開始逐位相加,處理進位。

Approaches

⭐ 1. Simulate Binary Addition — O(max(m, n)) / O(max(m, n))
  • Idea: 雙指標從末尾開始,逐位計算和與進位
  • Time: O(max(m, n)) - m, n 為兩字串長度
  • Space: O(max(m, n)) - 結果字串
class Solution {
    fun addBinary(a: String, b: String): String {
        val sb = StringBuilder()
        var i = a.length - 1
        var j = b.length - 1
        var carry = 0

        while (i >= 0 || j >= 0 || carry > 0) {
            var sum = carry
            if (i >= 0) {
                sum += a[i] - '0'
                i--
            }
            if (j >= 0) {
                sum += b[j] - '0'
                j--
            }
            sb.append(sum % 2)
            carry = sum / 2
        }

        return sb.reverse().toString()
    }
}
2. Bitwise (no addition) — O(max(m, n)) / O(max(m, n))
  • Idea: 用 XOR 做不進位加法,AND + 左移做進位計算,重複直到無進位。需用 BigInteger 處理大數
  • Time: O(max(m, n)) - 最多迭代 max(m,n) 次
  • Space: O(max(m, n))
import java.math.BigInteger

class Solution {
    fun addBinary(a: String, b: String): String {
        var x = BigInteger(a, 2)
        var y = BigInteger(b, 2)
        while (y != BigInteger.ZERO) {
            val sum = x.xor(y)           // 不進位加法
            val carry = x.and(y).shiftLeft(1)  // 進位
            x = sum
            y = carry
        }
        return x.toString(2)
    }
}

🔑 Takeaways