内容提要
LeetCode位运算非面试高频,应聚焦核心考点。重点模板:用n&(n-1)统计位1个数,可解比特位计数、整数转换;用逐位求和取模解决“出现M次”类问题;清除最右1位可解2的幂、范围按位与。掌握模板即可快速套用。
延伸解读
位运算在面试中的实际权重
文章指出位运算并非面试高频考题,226道相关题目中困难题往往考点是贪心、回溯、DFS等,只是恰好可用位运算解题。因此时间有限时应优先投入二叉树、链表、排序等更高频题型,位运算只需掌握核心模板即可,不必追求刷完所有标签题目。
统计位1个数的模板复用价值
约30%的位运算题是统计位1个数的衍生题。掌握n&(n-1)循环清除最右1位的模板后,可直接套用于比特位计数、二进制表示中质数个计算置位、整数转换、最少位翻转次数等题,只需在外层增加循环或质数判断等简单逻辑。
出现M次问题的通用解法
对于除一个元素外其余出现M次的问题,可逐位统计所有元素在该位为1的个数,对M取模得到目标数字在该位的值,再用位移和或运算组合结果。该模板只需修改M值即可适应不同出现次数,且满足常量空间要求。
清除最右1位的典型应用
n&(n-1)可清除最右侧的1位。利用此特性可解2的幂判断(清除后为0)、数字范围按位与(循环清除right最右1位直到left不小于right)、将数字变成0的操作次数(循环清除并计数)。这些题目代码简洁,适合快速套用。
Q&A
LeetCode 位运算题目有 226 道,需要全部刷完吗?
不需要。位运算并非面试高频考题,全部刷完会投入大量时间。更聪明的方式是掌握核心考点和常考题目,以最小的时间投入换取更大的刷题效率回报。
如何统计一个整数的二进制表示中位 1 的个数?
可以使用 n & (n-1) 操作,每次去掉最右边的 1,直到 n 为 0,循环次数即为位 1 的个数。
LeetCode 137 题只出现一次的数字,除了某个元素只出现一次外,其余每个元素均出现三次,如何用位运算解决?
对每个二进制位,统计所有数字该位为 1 的个数,然后对 3 取模,结果即为只出现一次的数字在该位的值。最后将各二进制位组合成结果。
如何判断一个整数是否是 2 的幂?
2 的幂的二进制表示中只有一个位为 1。因此,如果 n > 0 且 n & (n-1) == 0,则 n 是 2 的幂。
LeetCode 201 题数字范围按位与,如何求解?
遍历区间 [left, right],每次将 right 与 right-1 进行按位与,直到 left >= right,返回 right。
位运算中如何设置、清除或切换第 k 位?
设置第 k 位:s |= (1 << k);第 k 位置 0:s &= ~(1 << k);切换第 k 位值:s ^= (1 << k)。