位运算
# 位运算的常用技巧
位运算是算法题里比较特殊的一种类型,它们利用二进制位运算的特性进行一些奇妙的优化 和计算。常用的位运算符号包括:“∧”按位异或、“&”按位与、“|”按位或、“∼”取反、“<<” 算术左移和“>>”算术右移。以下是一些常见的位运算特性,其中 0s 和 1s 分别表示只由 0 或 1 构成的二进制数字。
除此之外,n & (n - 1) 可以去除 n 的位级表示中最低的那一位,例如对于二进制表示 11110100 ,减去 1 得到 11110011,这两个数按位与得到 11110000。n & (-n) 可以得到 n 的位级表示中最低 的那一位,例如对于二进制表示 11110100,取负得到 00001100,这两个数按位与得到 00000100。
# 基础问题
# 汉明距离
461. 汉明距离 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)
我太菜了,连基本的位运算都不会太难了
func hammingDistance(x int, y int) int {
// 进行异或运算,相同为0,不同为1
diff:=x^y
ans:=0
// 当我们的diff为0时我们就计算完了
for diff > 0 {
// 当我们这位不相同时,我们异或运算的结果就为1
ans+=diff&1
// 然后我们往右移动一位
diff>>=1
}
return ans
}
2
3
4
5
6
7
8
9
10
11
12
13
# 颠倒二进制位
190. 颠倒二进制位 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)
# 只出现一次的数字
136. 只出现一次的数字 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)
# 二进制特性
利用二进制的一些特性,我们可以把位运算使用到更多问题上。 例如,我们可以利用二进制和位运算输出一个数组的所有子集。假设我们有一个长度为 n 的 数组,我们可以生成长度为 n 的所有二进制,1 表示选取该数字,0 表示不选取。这样我们就获 得了 2 n 个子集
# 4的幂
342. 4的幂 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)
。。。这题目就一行代码,感觉我好菜啊
func isPowerOfFour(n int) bool {
return n>0 && (n & (n-1))==0 && (n&1431655765)>0
}
2
3
# 最大单词长度乘积
318. 最大单词长度乘积 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)
# 比特位计数
338. 比特位计数 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)