LC 1835. 所有数对按位与结果的异或和
这题有点意思,首先思路要要对,就是针对判断每个位。
假设在xth bit上,A1有a个0, b个1,A2有c个0, d个1,那么A1 x A2就有
- a x c 个 0 & 0
- a x d 个 0 & 1
- b x c 个 1 & 0
- b x d 个 1 & 1
所以最终有 (ac + ad + bc) 个0, bd个1.
如果1是偶数个的话,那么最终结果就是0,否则就是1.
一个优化点就是判断最多有多少个bits.
class Solution:
def getXORSum(self, arr1: List[int], arr2: List[int]) -> int:
maxv = max(max(arr1), max(arr2))
maxbits = 0
for i in reversed(range(32)):
if maxv & (1 << i):
maxbits = i + 1
break
def count(arr):
ones = [0] * 32
for i in range(maxbits):
mask = 1 << i
for x in arr:
if x & mask:
ones[i] += 1
return ones
a = count(arr1)
b = count(arr2)
ans = 0
for i in range(32):
c = a[i] * b[i]
if c % 2:
ans = ans | (1 << i)
return ans