1486. 数组异或操作
1486. 数组异或操作
- 标签:位运算、数学
- 难度:简单
题目链接
题目大意
给定两个整数 n、start。数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)。n 为数组长度。返回数组 nums 中所有元素按位异或(XOR)后得到的结果。
解题思路
1. 模拟
直接按照题目要求模拟即可。
2. 规律
- ;
- (交换律);
- (结合律);
- (自反性);
- ,有 ;
- ,有 ;
- ,有 。
本题中计算的是 。
可以看出,若 start 为奇数,则 都为奇数。若 start 为偶数,则 都为偶数。则它们对应二进制的最低位相同,则我们可以将最低位提取处理单独处理。从而将公式转换一下。
令 ,则等式变为 ,e 表示运算结果的最低位。
根据自反性,
例如:
就变为了计算前 n 项序列的异或值。假设我们定义一个函数 sumXor(x) 用于计算前 n 项数的异或结果,通过观察可得出:
sumXor(x) = \begin{cases} \begin{array} \ x, & x = 4i, k \in Z \cr (x-1) \oplus x, & x = 4i+1, k \in Z \cr (x-2) \oplus (x-1) \oplus x, & x = 4i+2, k \in Z \cr (x-3) \oplus (x-2) \oplus (x-3) \oplus x, & x = 4i+3, k \in Z \end{array} \end{cases}
继续化简得:
sumXor(x) = \begin{cases} \begin{array} \ x, & x = 4i, k \in Z \cr 1, & x = 4i+1, k \in Z \cr x+1, & x = 4i+2, k \in Z \cr 0, & x = 4i+3, k \in Z \end{array} \end{cases}
则最终结果为 。
下面还有最后一位 e 的计算。
- 若 start 为偶数,则最后一位 e 为 0。
- 若 start 为奇数,最后一位 e 跟 n 有关,若 n 为奇数,则最后一位 e 为 1,若 n 为偶数,则最后一位 e 为 0。
总结下来就是 e = start & n & 1
。
代码
- 模拟
class Solution:
def xorOperation(self, n: int, start: int) -> int:
ans = 0
for i in range(n):
ans ^= (start + i * 2)
return ans
- 规律
class Solution:
def sumXor(self, x):
if x % 4 == 0:
return x
if x % 4 == 1:
return 1
if x % 4 == 2:
return x + 1
return 0
def xorOperation(self, n: int, start: int) -> int:
s = start >> 1
e = n & start & 1
ans = self.sumXor(s-1) ^ self.sumXor(s + n - 1)
return ans << 1 | e