LeetCode 3934: Find X Value of Array XIV (Bit Manipulation / Prefix-Suffix)
LeetCode 3934Source: https://leetcode.com/problems/find-x-value-of-array-xiv/
English
For each index i, compute XOR of all elements except nums[i]. Build prefix XOR pre and suffix XOR suf, then answer i is pre[i] ^ suf[i+1]. This turns repeated recomputation into one linear pass.
Complexity: O(n) time, O(n) space.
class Solution {
public int[] findXValue(int[] nums) {
int n = nums.length;
int[] pre = new int[n + 1];
int[] suf = new int[n + 1];
for (int i = 0; i < n; i++) pre[i + 1] = pre[i] ^ nums[i];
for (int i = n - 1; i >= 0; i--) suf[i] = suf[i + 1] ^ nums[i];
int[] ans = new int[n];
for (int i = 0; i < n; i++) ans[i] = pre[i] ^ suf[i + 1];
return ans;
}
}func findXValue(nums []int) []int {
n := len(nums)
pre := make([]int, n+1)
suf := make([]int, n+1)
for i := 0; i < n; i++ { pre[i+1] = pre[i] ^ nums[i] }
for i := n-1; i >= 0; i-- { suf[i] = suf[i+1] ^ nums[i] }
ans := make([]int, n)
for i := 0; i < n; i++ { ans[i] = pre[i] ^ suf[i+1] }
return ans
}class Solution {
public:
vector<int> findXValue(vector<int>& nums) {
int n = nums.size();
vector<int> pre(n + 1), suf(n + 1), ans(n);
for (int i = 0; i < n; ++i) pre[i + 1] = pre[i] ^ nums[i];
for (int i = n - 1; i >= 0; --i) suf[i] = suf[i + 1] ^ nums[i];
for (int i = 0; i < n; ++i) ans[i] = pre[i] ^ suf[i + 1];
return ans;
}
};class Solution:
def findXValue(self, nums: list[int]) -> list[int]:
n = len(nums)
pre = [0] * (n + 1)
suf = [0] * (n + 1)
for i, x in enumerate(nums):
pre[i + 1] = pre[i] ^ x
for i in range(n - 1, -1, -1):
suf[i] = suf[i + 1] ^ nums[i]
return [pre[i] ^ suf[i + 1] for i in range(n)]function findXValue(nums) {
const n = nums.length;
const pre = new Array(n + 1).fill(0);
const suf = new Array(n + 1).fill(0);
for (let i = 0; i < n; i++) pre[i + 1] = pre[i] ^ nums[i];
for (let i = n - 1; i >= 0; i--) suf[i] = suf[i + 1] ^ nums[i];
const ans = new Array(n);
for (let i = 0; i < n; i++) ans[i] = pre[i] ^ suf[i + 1];
return ans;
}中文
对每个下标 i,目标是计算「除 nums[i] 外所有元素的异或值」。先构建前缀异或 pre 和后缀异或 suf,则答案为 pre[i] ^ suf[i+1],把重复计算降为一次线性扫描。
复杂度:时间 O(n),空间 O(n)。
class Solution {
public int[] findXValue(int[] nums) {
int n = nums.length;
int[] pre = new int[n + 1];
int[] suf = new int[n + 1];
for (int i = 0; i < n; i++) pre[i + 1] = pre[i] ^ nums[i];
for (int i = n - 1; i >= 0; i--) suf[i] = suf[i + 1] ^ nums[i];
int[] ans = new int[n];
for (int i = 0; i < n; i++) ans[i] = pre[i] ^ suf[i + 1];
return ans;
}
}func findXValue(nums []int) []int {
n := len(nums)
pre := make([]int, n+1)
suf := make([]int, n+1)
for i := 0; i < n; i++ { pre[i+1] = pre[i] ^ nums[i] }
for i := n-1; i >= 0; i-- { suf[i] = suf[i+1] ^ nums[i] }
ans := make([]int, n)
for i := 0; i < n; i++ { ans[i] = pre[i] ^ suf[i+1] }
return ans
}class Solution {
public:
vector<int> findXValue(vector<int>& nums) {
int n = nums.size();
vector<int> pre(n + 1), suf(n + 1), ans(n);
for (int i = 0; i < n; ++i) pre[i + 1] = pre[i] ^ nums[i];
for (int i = n - 1; i >= 0; --i) suf[i] = suf[i + 1] ^ nums[i];
for (int i = 0; i < n; ++i) ans[i] = pre[i] ^ suf[i + 1];
return ans;
}
};class Solution:
def findXValue(self, nums: list[int]) -> list[int]:
n = len(nums)
pre = [0] * (n + 1)
suf = [0] * (n + 1)
for i, x in enumerate(nums):
pre[i + 1] = pre[i] ^ x
for i in range(n - 1, -1, -1):
suf[i] = suf[i + 1] ^ nums[i]
return [pre[i] ^ suf[i + 1] for i in range(n)]function findXValue(nums) {
const n = nums.length;
const pre = new Array(n + 1).fill(0);
const suf = new Array(n + 1).fill(0);
for (let i = 0; i < n; i++) pre[i + 1] = pre[i] ^ nums[i];
for (let i = n - 1; i >= 0; i--) suf[i] = suf[i + 1] ^ nums[i];
const ans = new Array(n);
for (let i = 0; i < n; i++) ans[i] = pre[i] ^ suf[i + 1];
return ans;
}
Comments