aboutsummaryrefslogtreecommitdiff
path: root/set_mismatch.rs
diff options
context:
space:
mode:
Diffstat (limited to 'set_mismatch.rs')
-rw-r--r--set_mismatch.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/set_mismatch.rs b/set_mismatch.rs
new file mode 100644
index 0000000..b490f8e
--- /dev/null
+++ b/set_mismatch.rs
@@ -0,0 +1,37 @@
+struct Solution;
+
+impl Solution {
+ pub fn find_error_nums(nums: Vec<i32>) -> Vec<i32> {
+ let mut xor = nums.iter().zip(1..=nums.len() as i32).fold(0, |acc, (&num, i)| acc ^ num ^ i);
+ xor &= -xor;
+ let (mut n0, mut n1) = (0, 0);
+ for &n in &nums {
+ if n & xor == 0 {
+ n0 ^= n;
+ } else {
+ n1 ^= n;
+ }
+ }
+ for i in 1..=nums.len() as i32 {
+ if i & xor == 0 {
+ n0 ^= i;
+ } else {
+ n1 ^= i;
+ }
+ }
+ for &n in &nums {
+ if n == n0 {
+ return vec![n0, n1];
+ }
+ if n == n1 {
+ return vec![n1, n0];
+ }
+ }
+ unreachable!()
+ }
+}
+
+fn main() {
+ let nums = vec![1,2,2,4];
+ print!("{:?}", Solution::find_error_nums(nums));
+}