位运算解决「伪回文」问题
位运算快速判断伪回文
伪回文
概念参考1457. 二叉树中的伪回文路径
[2,3,3]
和[2,1,1]
都为伪回文序列
以[2,3,3]
为例子,打破顺序后 有3-2-3
为回文序列
如何快速判断?
位运算
异或
两大性质:(假定x为正整数)
1、0^x = x
2、x^x = 0
x & (x - 1)
可以去除x
最后一个1(当然是二进制下
例如:x = 1 010 100
x - 1 = 1 010 011则 x&(x - 1) = 1 010 000
显然去除了最后一个1
例子
1457. 二叉树中的伪回文路径为例子,每一个数值限定0~9
,则将每一个数用对应的位数表示
1 << x;
1–>10
2–>100
3–>1 000
4–>10 000
…
9–>1 000 000 000
则回文序列
case1: 5-4-3-4-5
奇数个
x ^= 1 << root->val;
利用 异或的两条性质
最后得到唯一落单的3,也即1000
再通过x & (x - 1)
去除最后一个也是唯一一个0,x就变成了0,
case2:5-4-4-5
偶数个
x ^= 1 << root->val;
相对简单了,若为此情况,最后一定是0
则判断是否是伪回文序列的条件为:
if (x == 0 || (x & (x - 1)) == 0) return true;