操作后的最大异或和
题目
2317. 操作后的最大异或和 - 力扣(LeetCode)
给你一个下标从 0 开始的整数数组 nums
。一次操作中,选择 任意 非负整数 x
和一个下标 i
,更新 nums[i]
为 nums[i] AND (nums[i] XOR x)
。
注意,AND
是逐位与运算,XOR
是逐位异或运算。
请你执行 任意次 更新操作,并返回 nums
中所有元素 最大 逐位异或和。
示例 1:
1 | 输入:nums = [3,2,4,6] |
示例 2:
1 | 输入:nums = [1,2,3,9,2] |
提示:
1 <= nums.length <= 10^5
0 <= nums[i] <= 10^8
解题
这道题有点脑筋急转弯的感觉。
要想获得最大逐位异或和(我们设为ans
),就必须尽可能的保留更多异或后的1的个数。
我们再来看这个运算操作:nums[i] AND (nums[i] XOR x)
实际上:
nums[i] XOR x
等同于将nums[i]
修改为任意非负整数。num[i] AND ???
等同于修改nums[i]
的某些比特位(由1修改为0)
由于我们想要尽可能的保留更多异或后的1的个数。因此必须使得二进制位上1
的个数要是奇数。因此nums[i] AND (nums[i] XOR x)
操作就是将某些比特位上的1
修改为0
,从而使得该位上的1
是奇数个,最终异或结果里该位上才是1
。
因此我们发现,这道题目要求的最大逐位异或和,实际上等价于对数组中每个元素的所有二进制位,只要某一位在数组中出现过 1
,那么答案里这一位也是 1
,得到的结果才达到最大。
因此我们可以用逐位或运算来尽最大努力保留每一位上的1
。
代码很简单:
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 翼同学的个人博客!
评论
ValineDisqus