前言
在将LeetCode上标签为位运算的题目刷完了之后,这里做一些总结,以至于后续在碰到类似的问题时,优先能够给我们提供一个最初的解题思路
总结
- 我们可以将位运算中的0和1可以表示为两种状态去处理某些只有两种状态下的问题
- 如LeetCode的784题,我们可以用0和1分别表示是否对字母进行转换或者不转换两种状态
- LeetCode的78题,同样可以用0和1分别表示数组的元素在解集中出现和不出现两种状态
- 在位的异或中有以下的几种性质
1、a^a = 0
2、0^a = a
3、a ^ b = c, c ^ a = b, b ^ c = a
我们可以用性质1和2解决LeetCode的136题,采用性质3解决LeetCode的421题(需要加上越高位是1的值越大的性质)
- 可以采用(n & (n-1))去除n的最低位的1,借助这个性质,可以解决类似于计算输入数的位1的个数,如LeetCode的191题
- 对于一个2的次幂数,具有性质 ((n & (n-1)) == 0),借助这个性质可以解决LeetCode的231题
- 对于一个4的次幂数,首先符合性质((n & (n-1)) == 0),并且位1的都出现在奇数位置上,借助这两个性质可以解决LeetCode的342题
- 对于一个3的次幂数,符合如下的规则:
3^n 能够被3^(n-1)、3^(n-2)....3整除
借助这个性质可以解决LeetCode的题326
- 如果我们想要获取一个数字的最低位的1,我们只需要借助以下的性质便可以得到
int n = x & ~x
- 对于一些给定的有限的元素,我们可以采用位进行表示,如LeetCode的题187,由于序列固定了ACGT,因此我们可以分别用00,01,10,11分别进行表示,进而进行下一步。