📅  最后修改于: 2023-12-03 15:41:33.583000             🧑  作者: Mango
给定一个非空的整数数组 nums,我们可以在其中添加一个数字,使得按位异或和最大。找到添加的数字。
根据异或的性质,相同数异或得0,不同数异或得1。所以我们希望数组中不同数字的二进制上的数位能够尽可能多,并且位数越高,对最终的异或值的贡献越大。
假设我们要添加的数字是a,最终异或结果为A。
将数组nums与a组合成新的数组newNums
找出数组newNums中的最大值max_num
计算max_num的二进制长度max_bits
利用位运算得出新的异或结果newA=(A xor max_num) << (max_bits-1)
尝试添加新的数字,如果得到的异或值更大,就更新a和A的值
返回值a即为要添加的数字
def findMinAddition(nums):
A = max_xor = 0
max_num = max(nums)
max_bits = len(bin(max_num)) - 2
for i in range(0, max_bits):
mask = 1 << i
new_max_xor = max_xor | mask
for num in nums:
if (num & mask) and (not new_max_xor & num):
new_max_xor |= num
if new_max_xor > max_xor:
max_xor = new_max_xor
A = (max_xor ^ max_num) << (max_bits - i - 1)
a = 0
for i in range(1, max_bits + 1):
x = A ^ (1 << (max_bits - i))
if not x in nums:
a |= (1 << (max_bits - i))
return a
nums = [3, 10, 12, 13]
print(findMinAddition(nums)) # 7
nums = [1, 5, 10]
print(findMinAddition(nums)) # 31
对于第一个测试样例,nums数组的二进制表示为:[011, 1010, 1100, 1101]。
按照上述算法,我们可以得到
max_num=13,max_bits=4,A=0,max_xor=0
i=0时,mask=1,new_max_xor=1
然而15不是num的一个元素,因此我们需要尝试添加数字。尝试添加0和1,异或结果都是15。于是我们继续尝试添加新的数字。
i=1时,mask=2,new_max_xor=3
尝试添加0,异或结果为11。尝试添加1,异或结果为15。继续尝试添加新的数字。
i=2时,mask=4,new_max_xor=11
尝试添加0,异或结果为13。尝试添加1,异或结果为15。继续尝试添加新的数字。
i=3时,mask=8,new_max_xor=13
尝试添加0,异或结果为13。尝试添加1,异或结果为15。此时已经尝试完所有数字,所以返回a=7。