← 返回编程题库
coding-add-binary-strings简单免费版2000ms未尝试

二进制字符串相加

Add Two Binary Strings

开始编码

给两个非空二进制字符串 ab(每个字符是 '0''1',除单独的 "0" 外没有前导零)。返回它们的和,仍以二进制字符串表示,除非答案就是 "0" 否则不带前导零。字符串长度可达 10⁴,意味着对应的整数最多约 10⁴ 位,远超 64 位机器整数范围——所以必须逐位相加,不能转成定宽 int。

请实现 solution(a: str, b: str) -> str。直观做法是列式加法,就是 2 进制下的小学竖式:从两个串的最低位(最右端)开始扫,每一列把两个位再加上进位。每列的和在 {0, 1, 2, 3} 之间;输出位是 sum % 2,新进位是 sum // 2(即 sum >> 1)。只要还有数字要扫或者进位不为零就继续——最后这个 or carry 决定了能否把最高位上的溢出再补一位。

Examples

solution("11", "1") 返回 "100"。第 0 列:1 + 1 = 2,写 0,进位 1。第 1 列:1 + 0 + 1 = 2,写 0,进位 1。两串都扫完了,但进位还是 1,再写一位 1。反转后是 "100"

solution("1111", "1") 返回 "10000"——级联进位的典型例子。每一列都是 1 + carry = 2,写 01;扫完四个 1 后进位仍是 1,要再补一位,所以两位 + 一位的输入产出五位输出。

solution("0", "0") 返回 "0"。两列都是 0 + 0 = 0,没有进位;缓冲区就是 "0",这就是答案(唯一允许的前导零情况)。

签名见 stubs/stub.py

Practical context

把比机器字长更宽的整数加起来,是任意精度算术("bignum")的核心原语。Python 的 int、GMP、OpenSSL BIGNUM、Java BigInteger 内部都用本题里这种从右往左进位传播的多字加法,只是把一位换成 32 位或 64 位的「肢」(limb),循环体变成 s = a[i] + b[j] + carry; out[i] = s & MASK; carry = s >> WORD_BITS。密码学(RSA、Diffie-Hellman、椭圆曲线密钥运算)完全活在这个范畴里:2048 位 RSA 密钥就是 32 个或 64 个 64 位 limb,加法、乘法、模幂都按 limb 来;最终进位刷出的那一步如果差一就是个非常隐蔽的 bug,因为只有最高 limb 全 1 时才会触发,普通单测覆盖不到。同样的算法也出现在 BCD 金融十进制加法(每一「位」是 4 比特、值 0–9,进位阈值是 10 而不是 2)、定点 DSP 累加器、以及 SIMD 宽加内联函数里。先把二进制版本——尤其是 while ... or carry 的终止条件——彻底吃透,是上手多 limb 实现之前最干净的一步。

约束条件

  • 1 ≤ len(a), len(b) ≤ 10^4
  • a 和 b 的每个字符都是 '0' 或 '1'
  • a 和 b 没有前导零,唯一例外是字符串 "0"
  • 返回的字符串没有前导零,唯一例外是答案为 "0"

样例

Case 1 · typical: simple carry, equal lengths

输入: ["11","1"]

期望: "100"

11 (3) + 1 (1) = 100 (4)。第 0 列 1+1=2 写 0 进 1;第 1 列 1+0+1=2 写 0 进 1;进位再补一位 1,反转得 "100"。

Case 2 · typical: carry-cascade all-ones

输入: ["1111","1"]

期望: "10000"

1111 (15) + 1 (1) = 10000 (16)。每列都是 1+carry=2,写 0 进 1;扫完四个 1 后进位仍为 1,再补一位最高位。这是典型的全 1 级联进位用例。

Case 3 · simple: zero plus zero

输入: ["0","0"]

期望: "0"

0 + 0 = 0。两列都是 0+0=0 无进位,结果是合法的「单字符 0」前导零情况。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · typical: simple carry, equal lengths

输入: ["11","1"]

期望: "100"

11 (3) + 1 (1) = 100 (4)。第 0 列 1+1=2 写 0 进 1;第 1 列 1+0+1=2 写 0 进 1;进位再补一位 1,反转得 "100"。

Case 2 · typical: carry-cascade all-ones

输入: ["1111","1"]

期望: "10000"

1111 (15) + 1 (1) = 10000 (16)。每列都是 1+carry=2,写 0 进 1;扫完四个 1 后进位仍为 1,再补一位最高位。这是典型的全 1 级联进位用例。

Case 3 · simple: zero plus zero

输入: ["0","0"]

期望: "0"

0 + 0 = 0。两列都是 0+0=0 无进位,结果是合法的「单字符 0」前导零情况。