楼主:
yam276 ('_')
2025-01-16 17:44:07※ 引述《Meaverzt (单推凛宝)》之铭言:
: 题目:
: 有两个阵列nums1跟nums2里面有很多数字
: 我们要去做一个nums3里面是nums1跟nums2中所有xor后可能的值
: 最后回传nums3每一项xor后的值
: 思路:
: 因为一个数字只要被xor两次就会变0
: 所以去算每个数字被xor几次
: 只要是奇数就去跟答案xor
这题是数学问题
暴力解是
for &n1 in &nums1 {
for &n2 in &nums2 {
result ^= (n1 ^ n2);
}
}
但这效率很烂 所以不太可能直接用这个
考虑到结果num3等于所有n1 ^ n2的xor
也就是num3实际上是
(nums1[i] ^ nums2[0]) ^ (nums1[i] ^ nums2[1]) ^ ... ^ (nums1[i] ^ nums2[n-1])
的结果
所以因为大家都是xor
根据分配律
可以改写成
nums1[i] ^ nums1[i] ^ ... ^ nums1[i] ^ nums2[0] ^ nums2[1] ^ ... ^ nums2[n-1]
然后总之
计算 nums1 的 XOR 和 xor1
计算 nums2 的 XOR 和 xor2
如果 nums2 的长度是奇数 则结果包含 xor1
如果 nums1 的长度是奇数 则结果包含 xor2
Code:
impl Solution {
pub fn xor_all_pairings(nums1: Vec<i32>, nums2: Vec<i32>) -> i32 {
let xor1: i32 = nums1.iter().fold(0, |acc, &x| acc ^ x);
let xor2: i32 = nums2.iter().fold(0, |acc, &x| acc ^ x);
let m = nums1.len();
let n = nums2.len();
let mut result = 0;
if n % 2 == 1 {
result ^= xor1;
}
if m % 2 == 1 {
result ^= xor2;
}
result
}
}