1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| struct Solution;
// @lc code=start
impl Solution {
/// ## 解题思路
/// - 位运算
/// 1. a ^ a = 0
/// a ^ b != 0 ( a != b )
/// 2. nums.xor() = a ^ b = x, (a, b为nus中的只出现一次的数字);
/// 3. mask = x & -x (取x的最右一位1), 此时a,b在该位必定有一个为0, 一个为1;
/// 4. nums[i] & mask 将 nums分为两个部分, 此时a, b将分别在这两个子集合中;
/// 5. 分别计算这两个集合的 xor_sum, 结果分别为a, b
pub fn single_number(nums: Vec<i32>) -> Vec<i32> {
let xor_sum = nums.iter().fold(0, |acc, &n| acc ^ n);
let mask = xor_sum & -xor_sum;
let (nums1, nums2): (Vec<i32>, Vec<i32>) = nums.iter().partition(|&n| n & mask == 0);
vec![
nums1.iter().fold(0, |a, &n| a ^ n),
nums2.iter().fold(0, |a, &n| a ^ n),
]
}
}
// @lc code=end
|