Skip to content

Commit

Permalink
1829. Maximum XOR for Each Query: AC
Browse files Browse the repository at this point in the history
  • Loading branch information
tan-wei committed Jan 3, 2025
1 parent e4f4718 commit 45f68fd
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/solution/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1378,3 +1378,4 @@ mod s1824_minimum_sideway_jumps;
mod s1825_finding_mk_average;
mod s1827_minimum_operations_to_make_the_array_increasing;
mod s1828_queries_on_number_of_points_inside_a_circle;
mod s1829_maximum_xor_for_each_query;
103 changes: 103 additions & 0 deletions src/solution/s1829_maximum_xor_for_each_query.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
/**
* [1829] Maximum XOR for Each Query
*
* You are given a sorted array nums of n non-negative integers and an integer maximumBit. You want to perform the following query n times:
* <ol>
* Find a non-negative integer k < 2^maximumBit such that nums[0] XOR nums[1] XOR ... XOR nums[nums.length-1] XOR k is maximized. k is the answer to the i^th query.
* Remove the last element from the current array nums.
* </ol>
* Return an array answer, where answer[i] is the answer to the i^th query.
*
* Example 1:
*
* Input: nums = [0,1,1,3], maximumBit = 2
* Output: [0,3,2,3]
* Explanation: The queries are answered as follows:
* 1^st query: nums = [0,1,1,3], k = 0 since 0 XOR 1 XOR 1 XOR 3 XOR 0 = 3.
* 2^nd query: nums = [0,1,1], k = 3 since 0 XOR 1 XOR 1 XOR 3 = 3.
* 3^rd query: nums = [0,1], k = 2 since 0 XOR 1 XOR 2 = 3.
* 4^th query: nums = [0], k = 3 since 0 XOR 3 = 3.
*
* Example 2:
*
* Input: nums = [2,3,4,7], maximumBit = 3
* Output: [5,2,6,5]
* Explanation: The queries are answered as follows:
* 1^st query: nums = [2,3,4,7], k = 5 since 2 XOR 3 XOR 4 XOR 7 XOR 5 = 7.
* 2^nd query: nums = [2,3,4], k = 2 since 2 XOR 3 XOR 4 XOR 2 = 7.
* 3^rd query: nums = [2,3], k = 6 since 2 XOR 3 XOR 6 = 7.
* 4^th query: nums = [2], k = 5 since 2 XOR 5 = 7.
*
* Example 3:
*
* Input: nums = [0,1,2,2,5,7], maximumBit = 3
* Output: [4,3,6,4,6,7]
*
*
* Constraints:
*
* nums.length == n
* 1 <= n <= 10^5
* 1 <= maximumBit <= 20
* 0 <= nums[i] < 2^maximumBit
* nums​​​ is sorted in ascending order.
*
*/
pub struct Solution {}

// problem: https://leetcode.com/problems/maximum-xor-for-each-query/
// discuss: https://leetcode.com/problems/maximum-xor-for-each-query/discuss/?currentPage=1&orderBy=most_votes&query=

// submission codes start here

impl Solution {
pub fn get_maximum_xor(nums: Vec<i32>, maximum_bit: i32) -> Vec<i32> {
let mut s = nums.iter().fold(0, |s, n| s ^ *n);
let m = (1 << maximum_bit) - 1; // maximum
let mut result = Vec::with_capacity(nums.len());

for &n in nums.iter().rev() {
result.push(s ^ m);
s ^= n;
}

result
}
}

// submission codes end

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_1829_example_1() {
let nums = vec![0, 1, 1, 3];
let maximum_bit = 2;

let result = vec![0, 3, 2, 3];

assert_eq!(Solution::get_maximum_xor(nums, maximum_bit), result);
}

#[test]
fn test_1829_example_2() {
let nums = vec![2, 3, 4, 7];
let maximum_bit = 3;

let result = vec![5, 2, 6, 5];

assert_eq!(Solution::get_maximum_xor(nums, maximum_bit), result);
}

#[test]
fn test_1829_example_3() {
let nums = vec![0, 1, 2, 2, 5, 7];
let maximum_bit = 3;

let result = vec![4, 3, 6, 4, 6, 7];

assert_eq!(Solution::get_maximum_xor(nums, maximum_bit), result);
}
}

0 comments on commit 45f68fd

Please sign in to comment.