Skip to content

Latest commit

 

History

History

1829.Maximum XOR for Each Query

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 

English Version

题目描述

给你一个 有序 数组 nums ,它由 n 个非负整数组成,同时给你一个整数 maximumBit 。你需要执行以下查询 n 次:

  1. 找到一个非负整数 k < 2maximumBit ,使得 nums[0] XOR nums[1] XOR ... XOR nums[nums.length-1] XOR k 的结果 最大化 。k 是第 i 个查询的答案。
  2. 从当前数组 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 = 7 。

示例 3:

输入:nums = [0,1,2,2,5,7], maximumBit = 3
输出:[4,3,6,4,6,7]

 

提示:

  • nums.length == n
  • 1 <= n <= 105
  • 1 <= maximumBit <= 20
  • 0 <= nums[i] < 2maximumBit
  • nums​​​ 中的数字已经按 升序 排好序。

解法

前缀异或。

Python3

class Solution:
    def getMaximumXor(self, nums: List[int], maximumBit: int) -> List[int]:
        n = len(nums)
        s = [0] * (n + 1)
        for i, x in enumerate(nums):
            s[i + 1] = s[i] ^ x
        ans = []
        for x in s[:0:-1]:
            t = 0
            for i in range(maximumBit):
                if ((x >> i) & 1) == 0:
                    t |= 1 << i
            ans.append(t)
        return ans

Java

class Solution {
    public int[] getMaximumXor(int[] nums, int maximumBit) {
        int n = nums.length;
        int[] s = new int[n + 1];
        for (int i = 0; i < n; ++i) {
            s[i + 1] = s[i] ^ nums[i];
        }
        int[] ans = new int[n];
        for (int i = n; i > 0; --i) {
            int t = 0, x = s[i];
            for (int j = 0; j < maximumBit; ++j) {
                if (((x >> j) & 1) == 0) {
                    t |= (1 << j);
                }
            }
            ans[n - i] = t;
        }
        return ans;
    }
}

C++

class Solution {
public:
    vector<int> getMaximumXor(vector<int>& nums, int maximumBit) {
        int n = nums.size();
        vector<int> s(n + 1);
        for (int i = 0; i < n; ++i) s[i + 1] = s[i] ^ nums[i];
        vector<int> ans;
        for (int i = n; i > 0; --i)
        {
            int t = 0, x = s[i];
            for (int j = 0; j < maximumBit; ++j) {
                if (((x >> j) & 1) == 0) t |= (1 << j);
            }
            ans.push_back(t);
        }
        return ans;
    }
};

Go

func getMaximumXor(nums []int, maximumBit int) []int {
	n := len(nums)
	s := make([]int, n+1)
	for i, v := range nums {
		s[i+1] = s[i] ^ v
	}
	var ans []int
	for i := n; i > 0; i-- {
		t, x := 0, s[i]
		for j := 0; j < maximumBit; j++ {
			if ((x >> j) & 1) == 0 {
				t |= (1 << j)
			}
		}
		ans = append(ans, t)
	}
	return ans
}

...