📖 位运算专题怎么用?

XOR(异或)是面试中的"装逼武器"——一行代码 O(1) 空间解决问题,面试官看到就知道你懂位运算。

本专题包含 2 道题,都是外企面试高频真题。每道题按统一结构讲解:

复习建议:先看生活类比理解问题本质,再看思路建立解题框架,最后手写代码 3 遍形成肌肉记忆。面试时先口述思路,确认无误后再写代码。

1只出现一次的数字 (Single Number) Easy

题目(人话版)

数组里每个数字都出现了两次,只有一个数字出现了一次。找出那个单独的数字。[4,1,2,1,2] → 答案是 4。要求 O(n) 时间 + O(1) 空间

💡 生活类比:想象一个派对——所有人都是成双成对来的(2个人一组),只有你是一个人来的。怎么找出你?让所有人排成一排,两两抵消,最后剩下那个就是你。XOR(异或)运算就是"两两抵消"的数学工具。

XOR 回顾

运算结果口诀
0 XOR 00相同→0
1 XOR 10相同→0
0 XOR 11不同→1
a XOR a0自己和自己抵消
a XOR 0a和 0 异或不变

所以:4 XOR 1 XOR 2 XOR 1 XOR 2 = 4 XOR (1 XOR 1) XOR (2 XOR 2) = 4 XOR 0 XOR 0 = 4!成对的全部抵消了。

singleNumber.js
1
2
3
4
5
6
function singleNumber(nums) { let result = 0; for (const num of nums) { result ^= num; // 全部 XOR 一遍 } return result; // 成对的抵消为 0,剩下的就是唯一的那个 }

时间 O(n),空间 O(1)。一行核心代码,面试官看到 XOR 就知道你懂位运算。

面试加分:主动说"暴力法用哈希表统计也可以,O(n) 时间但 O(n) 空间。XOR 的优势是 O(1) 空间——不额外占内存。面试官问'还有别的方法吗'时主动说出 XOR 会让面试官眼前一亮。"

2缺失数字 (Missing Number) Easy

题目(人话版)

给你 [3,0,1],数字范围是 0~3(共 4 个数),但数组只有 3 个。缺了哪个?答案是 2

💡 生活类比:一盒扑克牌本来有 0~n 共 n+1 张,现在丢了一张。怎么找?算"应该的总和"减去"实际的总和",差值就是丢的那张。比如 0+1+2+3=6,实际只有 3+0+1=4,6-4=2,丢的是 2。

方法一:数学公式法

missingNumber-math.js
1
2
3
4
5
function missingNumber(nums) { const n = nums.length; // 0~n 的和 = n*(n+1)/2 (等差数列求和公式) const expectedSum = n * (n + 1) / 2; const actualSum = nums.reduce((a, b) => a + b, 0); return expectedSum - actualSum; }

方法二:XOR 法

把数组的每个数和 0~n 的每个数全部 XOR,成对出现的抵消,剩下的就是缺失的。

missingNumber-xor.js
1
2
3
4
5
6
7
function missingNumber(nums) { let result = nums.length; // 先放 n for (let i = 0; i < nums.length; i++) { result ^= i ^ nums[i]; // 索引和值一起 XOR } return result; } // [3,0,1]: result = 3 ^ (0^3) ^ (1^0) ^ (2^1) = 2

两种方法都是 O(n) 时间 O(1) 空间。数学法更直觉,XOR 法更装逼。

📋 位运算专题速查表

#题目难度
1只出现一次的数字 (Single Number)Easy
2缺失数字 (Missing Number)Easy
考点核心:位运算专题的核心就是"用对工具,降复杂度"。 面试时拿到题先想:"这道题能用位运算吗?" 如果能,先说思路再写代码,面试官就知道你的分析能力。

🔗 其他考点专题

双指针专题:回文检测 (Valid Palindrome), 反转字符串 (Reverse String), 合并两个有序数组 (Merge Sorted Arrays), 移动零 (Move Zeroes)

哈希表专题:两数之和 (Two Sum), 有效的字母异位词 (Valid Anagram), 数组去重/判断有重复 (Contains Duplicate), 第一个唯一字符 (First Unique Character)

动态规划专题:斐波那契数列 (Fibonacci), 爬楼梯 (Climbing Stairs), 最大子序和 (Max Subarray)

栈与滑动窗口专题:有效括号 (Valid Parentheses), 最长不重复子串 (Longest Substring)

综合技巧专题:FizzBuzz, 买卖股票的最佳时机 (Best Time to Buy/Sell Stock), 多数元素 (Majority Element), 旋转数组 (Rotate Array), 二分查找 (Binary Search)

← 返回图解算法与模式