Re: [闲聊] 每日leetcode

楼主: Meaverzt (Meaverzt)   2025-01-16 14:53:07
题目:
有两个阵列nums1跟nums2里面有很多数字
我们要去做一个nums3里面是nums1跟nums2中所有xor后可能的值
最后回传nums3每一项xor后的值
思路:
因为一个数字只要被xor两次就会变0
所以去算每个数字被xor几次
只要是奇数就去跟答案xor
Code:
class Solution {
public:
int xorAllNums(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int, int> dict;
auto a = nums1.size(), b = nums2.size();
for (auto i : nums2) {
dict[i] += a;
}
for (auto i : nums1) {
dict[i] += b;
}
int ans = 0;
for (auto& [key, value] : dict) {
if (value % 2 == 1) {
ans ^= key;
}
}
return ans;
}
};
虽然是O(n)了结果跑起来一坨
思路二:
nums1 nums2里面每个数字两两xor的情况下
nums2里面的数字会被xor len(nums1)次
同理nums1里面的数字会被xor len(nums2)次
所以只要把同一个阵列都先xor起来
再去看阵列长度是不是奇数就好了
Code:
class Solution {
public:
int xorAllNums(vector<int>& nums1, vector<int>& nums2) {
int a = 0, b = 0;
for (int num : nums1)
a ^= num;
for (int num : nums2)
b ^= num;
return (nums1.size() % 2 ? b : 0) ^ (nums2.size() % 2 ? a : 0);
}
};
bit操作的题目真的好烦

Links booklink

Contact Us: admin [ a t ] ucptt.com