Find The Original Array of Prefix Xor
MEDIUMDescription
You are given an integer array pref of size n. Find and return the array arr of size n that satisfies:
pref[i] = arr[0] ^ arr[1] ^ ... ^ arr[i].
Note that ^ denotes the bitwise-xor operation.
It can be proven that the answer is unique.
Example 1:
Input: pref = [5,2,0,3,1] Output: [5,7,2,3,2] Explanation: From the array [5,7,2,3,2] we have the following: - pref[0] = 5. - pref[1] = 5 ^ 7 = 2. - pref[2] = 5 ^ 7 ^ 2 = 0. - pref[3] = 5 ^ 7 ^ 2 ^ 3 = 3. - pref[4] = 5 ^ 7 ^ 2 ^ 3 ^ 2 = 1.
Example 2:
Input: pref = [13] Output: [13] Explanation: We have pref[0] = arr[0] = 13.
Constraints:
1 <= pref.length <= 1050 <= pref[i] <= 106
Approaches
Checkout 3 different approaches to solve Find The Original Array of Prefix Xor. Click on different approaches to view the approach and algorithm in detail.
Brute-Force with Re-computation
This naive approach directly implements the definition of the prefix XOR array. To find each element arr[i], it re-computes the XOR sum of all previously found elements arr[0] through arr[i-1]. While correct, this method is computationally expensive.
Algorithm
- Create a new integer array
arrof the same size aspref. - If
prefis not empty, setarr[0] = pref[0]. - Iterate with a loop from
i = 1topref.length - 1. - Inside the loop, calculate the prefix XOR of the already computed part of
arr:prefixXorOfArr = arr[0] ^ arr[1] ^ ... ^ arr[i-1]. This requires a nested loop. - Calculate
arr[i] = prefixXorOfArr ^ pref[i]. - After the loop, return
arr.
The fundamental relationship is pref[i] = arr[0] ^ arr[1] ^ ... ^ arr[i]. From this, we can derive arr[i] = (arr[0] ^ arr[1] ^ ... ^ arr[i-1]) ^ pref[i]. The algorithm proceeds by building the arr array element by element. For each arr[i], it first iterates through arr[0] to arr[i-1] to calculate their XOR sum, and then XORs this sum with pref[i] to find arr[i]. This repetitive calculation of the prefix XOR for arr makes the approach inefficient.
class Solution {
public int[] findArray(int[] pref) {
int n = pref.length;
if (n == 0) {
return new int[0];
}
int[] arr = new int[n];
arr[0] = pref[0];
for (int i = 1; i < n; i++) {
// Re-compute prefix XOR of arr
int prefixXorOfArr = 0;
for (int j = 0; j < i; j++) {
prefixXorOfArr ^= arr[j];
}
arr[i] = prefixXorOfArr ^ pref[i];
}
return arr;
}
}
Complexity Analysis
Pros and Cons
- It's a straightforward implementation of the mathematical definition, making it easy to conceptualize.
- Highly inefficient due to the nested loops, resulting in quadratic time complexity.
- Will likely cause a 'Time Limit Exceeded' (TLE) error for large inputs as specified in the constraints.
Code Solutions
Checking out 3 solutions in different languages for Find The Original Array of Prefix Xor. Click on different languages to view the code.
Video Solution
Watch the video walkthrough for Find The Original Array of Prefix Xor
Similar Questions
5 related questions you might find useful
Patterns:
Data Structures:
Companies:
Subscribe to Scale Engineer newsletter
Learn about System Design, Software Engineering, and interview experiences every week.
No spam, unsubscribe at any time.