题目描述
思路解析动画文字版
笨办法是把二进制转成十进制相加再转回去——但数一长就溢出。更稳的办法是直接模仿手算竖式,永远不溢出。
盯死两条规则:本位 = 和 % 2、进位 = 和 ÷ 2。和最大是 1+1+1=3,所以本位最多写 1、进位最多 1,绝不会乱。
末尾对齐 · 准备开算:下面 5 个空格是给结果留的位置(两数最长 4 位,加法最多多进 1 位 → 留 5 格)。我们从最右一列往左逐列填。
对齐示意 · a 的各位:先把 a = 1010 靠右摆进格子看清对齐(灰色只是示意,不是最终结果)。注意末位 0 落在最右那一列。
对齐示意 · b 的各位:b = 1011 也靠右摆,它的末位 1 和 a 的末位 0 正好同列。两数末尾对齐了,就能像竖式那样逐列加。现在清空,正式开算。
第 1 列 · 最右位:最右列:a 的末位是 0、b 的末位是 1、进位 0。和 = 1。本位写 1,没有进位。
第 1 列 · 写下结果:把 1 填进最右格(变绿表示已确定),进位还是 0。指针准备左移到下一列。
第 2 列:往左挪一列:a 这位是 1、b 这位是 1,进位 0。和 = 2 —— 逢二进一!本位写 0,进位 1 留给下一列。
第 2 列 · 写下结果:填入 0。注意 carry 变成 1 了——这个 1 必须带到下一列一起加,千万别丢。
第 3 列:这一列 a、b 都是 0,但别忘了上一列带来的进位 1!和 = 0+0+1 = 1。本位写 1,进位清 0。
第 3 列 · 写下结果:填入 1,进位归 0。结果已经攒到 101(从右往左读)。继续左移。
第 4 列 · 最左原位:到两数的最高位:a 是 1、b 是 1。和 = 2,又逢二进一!本位写 0,进位 1。
第 4 列 · 写下结果:填入 0。两个数都加完了,但 carry 还剩 1!这就是为什么结果要多留一格——进位还得再写出来。
最后一列 · 进位单独成位:a、b 都没位了,只剩 进位 1。和 = 1,本位写 1。这一步常被忘掉——循环条件必须带上「carry 不为 0 也要继续」。
完成 · 结果 = 10101:最高位填 1,5 格全确定。整行从左往右读就是答案 10101——十进制验证 10 + 11 = 21,完全对上。
再演一例 · a=11 b=1:换个数 11 + 1 再走一遍,这次专盯雷区说的进位连锁——一个进位怎么一路顶到最高位。两数最长 2 位,留 3 格。
第 1 列 · 最右位:最右列:a 末位 1、b 末位 1。和 = 2,逢二进一,本位写 0,进位 1。
第 1 列 · 写下结果:填入 0,进位 1 带往下一列。
第 2 列:b 已经没位了(当 0 算),a 这位 1 加进位 1 = 2,又逢二进一!本位 0,进位还是 1——连锁了。
第 2 列 · 写下结果:填 0。两个数都加完了,但 carry 仍是 1,循环靠 carry 条件继续。
最后一列 · 进位成最高位:最高位把进位 1 写出来,结果 100(= 十进制 4 = 3 + 1)。看清了吗——一个进位从最右一路顶到了最左,这就是连锁。
这就是「大数加法」的通用套路。把它从二进制换成十进制(逢十进一)、换成任意进制都成立——核心永远是对齐末位、逐列带进位。
雷区实演 · 漏了 carry 收尾:算 1 + 1:本位写 0、进位 1,可如果循环条件不带 carry,这里就直接结束,结果只剩 0。正确答案是 10——那个进位的 1 必须再补一列。
边界三连:先想进位连锁(11+1)、全零(0+0)、最高位再进位三种,代码就稳了。
面试追问:把「为何不转整数(溢出)」和「换进制就通用」讲清楚,是这题面试的加分项。
参考代码
class Solution: def addBinary(self, a, b): i, j = len(a) - 1, len(b) - 1 # 两个末尾下标 carry = 0 res = [] while i >= 0 or j >= 0 or carry: # 进位没清也要继续 s = carry if i >= 0: s += int(a[i]); i -= 1 if j >= 0: s += int(b[j]); j -= 1 res.append(str(s % 2)) # 本位 carry = s // 2 # 进位 return "".join(reversed(res)) # 倒序拼回复杂度
- 时间复杂度:O(max(m,n)),m、n 是两串长度;每一列只做常数次运算,总列数 = 较长串长度(最多再多 1 位)
- 空间复杂度:O(max(m,n)),结果串长度与较长输入同阶(最多多 1 位的进位)
易错点
面试追问把动画讲成自己的话
追问为什么不直接转十进制相加?
追问时间复杂度是多少?
追问如果是两个十进制大数相加呢?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
字符串中的第一个唯一字符
LeetCode 387 · 简单 · 沿着 字符串套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题