tmp
作者:
stateless
,
2021-12-27 18:17:50
,
所有人可见
,
阅读 240
leetcode 136
x ^ x = 0
leetcode 137
一种思路:如果你笃定该题可以通过位运算解决,那么可以从其中某一位出发找它的特性,其他31位是同样的操作
从个位出发,看我们求的答案的个位是0
如果出现一次的数的个位是0的话,那么1的个数是3m个,0的个数是3m+1个
如果出现一次的数的个位是1的话,那么1的个数是3m+1个,0的个数是3m个
因此我们想统计的是1的个数是%3余几的,有三种状态,可以用状态机(DFA)去求
1的个数模3余0,余1,余2
leetcode 190
如何找出n的二进制表示的第k位
(n >> k) & 1 // 111 -> 001 & 1 = 1
循环一遍
如何把二进制数转换成10进制
11010 (res << 1) + i
uint32_t res = 0;
for (int i = 0; i < 32; i++)
res = (res << 1) + (n >> i & 1);
return res;
leetcode 191
统计1的个数
法一:
lowbit(x) = x & (~x + 1) = x & (-x) 返回x的二进制表示的最后一个1
x: -----1000
~x: ----0111
~x+1: ----1000
x & (~x+1) = 00001000
uint32_t lowbit(uint32_t n) {
return n & (-n);
}
int hammingWeight(uint32_t n) {
int res = 0;
while(n) {
n -= lowbit(n);
res++;
}
return res;
}
法二:
while(n) {
n &= n - 1;
cnt++;
}
leetcode 231
n > 0 && n & (-n) == n
leetcode 371
a ^ b 异或相当于不进位加法
1 1 0 1
1 0 1 1
-------
0 1 1 0
a + b 先算 a ^ b 再算进位
进位:两个1相加才进位,a 与 b 再左移一位 (a & b)
>> 1
((a&b) << 1) + (a ^ b)
a' + b' 可以看成a' + b'
会不会无线转换? (不会)
因为a'末尾会成为0,无线循环下去,最终a'一定会是0(最多32次)
if(!a) return b;
int sum = a ^ b;
int carry = (unsigned)(a & b) << 1;
return getSum(carray, sum);
leetcode 461
hanming 距离:两个整数二进制表示有多少位不一样
异或
int hammingDistance(int x, int y) {
int n = x ^ y;
int cnt = 0;
while(n) {
n &= n - 1;
cnt++;
}
return cnt;
}
leetcode 51
n - 皇后
搜索顺序:每一行可以放一个皇后且只能放一个,按行枚举(第1行皇后可以放到那一列)