题目描述
思路解析动画文字版
记住「下标=该有的、元素=实际有的,缺的那个落单」,下面每一帧都在套它。
异或的魔法:相同的数碰一起就消失,落单的留到最后。
数组下标只到 8,但全集是 0..9。下标 9 没有格子,先把它放进 acc 作初值 = 9。
处理下标 0:把「下标 0」和「这格的值 3」都异或进 acc。配对出现的数会两两抵消,acc 现在 = 10。
处理下标 1:把「下标 1」和「这格的值 0」都异或进 acc。配对出现的数会两两抵消,acc 现在 = 11。
处理下标 2:把「下标 2」和「这格的值 1」都异或进 acc。配对出现的数会两两抵消,acc 现在 = 8。
处理下标 3:把「下标 3」和「这格的值 4」都异或进 acc。配对出现的数会两两抵消,acc 现在 = 15。
处理下标 4:把「下标 4」和「这格的值 6」都异或进 acc。配对出现的数会两两抵消,acc 现在 = 13。
处理下标 5:把「下标 5」和「这格的值 5」都异或进 acc。配对出现的数会两两抵消,acc 现在 = 13。
处理下标 6:把「下标 6」和「这格的值 2」都异或进 acc。配对出现的数会两两抵消,acc 现在 = 9。
处理下标 7:把「下标 7」和「这格的值 8」都异或进 acc。配对出现的数会两两抵消,acc 现在 = 6。
处理下标 8:把「下标 8」和「这格的值 9」都异或进 acc。配对出现的数会两两抵消,acc 现在 = 7。
全部异或完毕。出现两次的数(下标和元素里都有)都成对抵消归零,只剩下那个只在下标里出现、没有对应元素的数:7。
该有的总和减去实际总和,缺口就是那个没加进来的数。
先算「该有的总和」= 0+1+…+9 = 45。再把数组元素一个个加起来求「实际和」,从 0 开始。
加上下标 0 这格的值 3,实际和 sum 累计到 3。
加上下标 1 这格的值 0,实际和 sum 累计到 3。
加上下标 2 这格的值 1,实际和 sum 累计到 4。
加上下标 3 这格的值 4,实际和 sum 累计到 8。
加上下标 4 这格的值 6,实际和 sum 累计到 14。
加上下标 5 这格的值 5,实际和 sum 累计到 19。
加上下标 6 这格的值 2,实际和 sum 累计到 21。
加上下标 7 这格的值 8,实际和 sum 累计到 29。
加上下标 8 这格的值 9,实际和 sum 累计到 38。
实际和加完是 38。该有的总和 45 减去它 = 7,正是那个没被加进来的缺失数。两种解法答案一致:7。
边界:缺 0、缺 n、单元素,异或/求和都能自然覆盖(关键是别漏下标 n)。
两个高频追问:异或法更抗溢出;缺两个数时按某一位分组各自异或。
参考代码
def missingNumber(nums): n = len(nums) acc = n # 先放下标 n for i, v in enumerate(nums): acc ^= i ^ v # 异或下标和元素 return acc # 成对抵消,剩缺失数# 求和法(等差和 - 实际和):# return n * (n + 1) // 2 - sum(nums)复杂度
- 时间:O(n),每个元素只扫一遍,异或或累加一次
- 空间:O(1),只用 acc/sum 一个变量,原地
易错点
面试追问把动画讲成自己的话
追问异或法和求和法,面试更推荐哪个?
追问如果缺了两个数怎么办?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
两整数之和
LeetCode 371 · 中等 · 沿着 位运算 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题