leetcode1829

张开发
2026/4/16 23:02:05 15 分钟阅读

分享文章

leetcode1829
leetcode 1829给你一个 有序 数组 nums 它由 n 个非负整数组成同时给你一个整数 maximumBit 。你需要执行以下查询 n 次找到一个非负整数 k 2maximumBit 使得 nums[0] XOR nums[1] XOR … XOR nums[nums.length-1] XOR k 的结果 最大化 。k 是第 i 个查询的答案。从当前数组 nums 删除 最后 一个元素。请你返回一个数组 answer 其中 answer[i]是第 i 个查询的结果。示例 1输入nums [0,1,1,3], maximumBit 2输出[0,3,2,3]解释查询的答案如下第一个查询nums [0,1,1,3]k 0因为 0 XOR 1 XOR 1 XOR 3 XOR 0 3 。第二个查询nums [0,1,1]k 3因为 0 XOR 1 XOR 1 XOR 3 3 。第三个查询nums [0,1]k 2因为 0 XOR 1 XOR 2 3 。第四个查询nums [0]k 3因为 0 XOR 3 3 。示例 2输入nums [2,3,4,7], maximumBit 3输出[5,2,6,5]解释查询的答案如下第一个查询nums [2,3,4,7]k 5因为 2 XOR 3 XOR 4 XOR 7 XOR 5 7。第二个查询nums [2,3,4]k 2因为 2 XOR 3 XOR 4 XOR 2 7 。第三个查询nums [2,3]k 6因为 2 XOR 3 XOR 6 7 。第四个查询nums [2]k 5因为 2 XOR 5 7class Solution {public int[] getMaximumXor(int[] nums, int maximumBit) { int n nums.length; //定义变量记录数组的异或之和这样就变成了两个数进行异或 int xorSum 0; for(int i : nums){ xorSum ^ i; } //想xorSum ^ ans[i]最大就让ans[i]尽可能每一位和xorSum相反 //1左移maxunumBit位再减1让maximun 1位都为1 int mask (1 maximumBit) - 1; int[] ans new int[n]; for(int i 0;i n;i){ //任何数和位全是1的数异或可以把每一位取反 //取反后的结果赋值给ans[i]就能使得ans[i]异或最大化 ans[i] mask ^ xorSum; //更新xorSum,依次去除数组后面的元素 xorSum ^ nums[n - i - 1]; } return ans; }}

更多文章