📅  最后修改于: 2023-12-03 15:21:58.786000             🧑  作者: Mango
按位XOR是指对两个数的每一位进行异或运算,得到的结果为1的位就是两个数在这一位上不相同的情况。
例如:5的二进制表示为101
,3的二进制表示为011
,则5和3的按位XOR运算结果为110
,即6。
给定一个整数数组,求其中具有奇数按位XOR值的子序列的数量。
一个子序列可以是数组中的任意一些数按顺序排列而成的序列,其中具有奇数按位XOR值的子序列包括:
对于第一种情况,可以遍历数组,统计其中奇数个数。
对于第二种情况,可以使用动态规划的思路。定义 f[i][j]
表示以 nums[i]
结尾、按位异或值为 j
的连续子序列的数量。
转移方程为:$f[i][j] = f[i-1][j] + f[i-1][j \operatorname{xor} nums[i]]$。
最终答案为所有 f[i][j]
中按位为1的总和。
以下是Python代码实现:
class Solution:
def countOddSubarrays(self, nums: List[int]) -> int:
odd_count = sum(map(lambda x: x % 2 != 0, nums)) # 统计奇数个数
dp = [[0] * 2 for _ in range(len(nums))] # 初始化dp数组
dp[0][nums[0] % 2] = 1 # 特判第一个数
res = dp[0][1] # 初始化
for i in range(1, len(nums)):
if nums[i] % 2 == 0:
dp[i][0] = dp[i-1][0]
dp[i][1] = dp[i-1][1]
else:
dp[i][0] = dp[i-1][1] + 1 # 注意要加上当前数单独作为子序列的情况
dp[i][1] = dp[i-1][0] + 1
res += dp[i][1] # 累加奇数按位异或的子序列数量
return res + odd_count
以上代码的时间复杂度为O(n)
,其中n
是数组的长度。