文章目录
1486. 数组异或操作
解法1:遍历异或
class Solution:
def xorOperation(self, n: int, start: int) -> int:
res = 0
for i in range(0,n):
res ^= start
start += 2
return res
解法2:找规律
由上图可推算出,
- 当n%4==0时,res = n 只剩一个数字
- 当n%4==1时,res = 1 剩两个数字
- 当n%4==2时,res = n+1 三个数字异或正好与第四个相容
- 当n%4==3时,res = 0 没有剩下数字
所以题目中的:
- res = (start+2 * 0)^(start+2 * 1) ^(start+2 * 2) ^ … ^(start+2 * (n-2)) ^
(start+2 * (n-1)) - res>>1 = (start/2+0) ^ (start/2+1) ^ (start/2+2) ^ … ^
(start/2+(n-2)) ^(start/2+(n-1))
所以令:
-
A = 1 ^ 2 ^ 3 ^ 4 ^ …^ (start/2-1)
-
B = 1 ^ 2 ^ 3 ^ 4 ^ …^ (start/2-1)+(start/2+0) ^ (start/2+1) ^
(start/2+2) ^ … ^ (start/2+(n-2)) ^(start/2+(n-1)) = A ^ (res>>1)
得到:
res>>1 = A ^ B
然后解决最后一位是否为1的情况,异或,只有当start为奇数并且,异或数总个数为奇数才会出现1,否则就为0
1 if n