位运算
8/6/25About 1 min
异或^
任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a。 任何数和其自身做异或运算,结果是 0,即 a⊕a=0。 异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。
只出现一次的数字
class Solution {
public int singleNumber(int[] nums) {
int single = 0;
for (int num : nums) {
single ^= num;
}
return single;
}
}
找不同
class Solution {
public char findTheDifference(String s, String t) {
int wo = 0;
for(char i : s.toCharArray()) wo ^= i;
for(char i : t.toCharArray()) wo ^= i;
return (char)wo;
}
}
二进制
判断2的幂
n > 0
2 的幂必须是正数(0 不是 2 的幂)。
(n & (n - 1)) == 0
如果n
是 2 的幂,它的二进制表示中 只有一个 1,例如:
- 1:
0001
- 2:
0010
- 4:
0100
- 8:
1000
而
n - 1
会把这个唯一的 1 变为 0,并将它右边所有位变为 1,例如:
4
是0100
4 - 1 = 3
是0011
0100 & 0011 = 0000
所以只有当
n
是 2 的幂时,n & (n - 1)
结果才是 0。这个位运算技巧可以 高效判断一个数是否是 2 的幂,时间复杂度是
O(1)
。
class Solution {
public boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
}
表示0-9数字是否出现过
36. 有效的数独 - 力扣(LeetCode)//位运算优化