Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Xin chào anh em tech warriors! Lại là Loser1 đây🌟
Hôm nay, chúng ta sẽ tiếp giải quyết một vấn đề thú vị thách thức khả năng hiểu biết của chúng ta về các phép toán bitwise—cụ thể là XOR. Hãy chuẩn bị để khám phá một bài toán yêu cầu tính toán phép XOR của tất cả các cặp giữa hai mảng. Nghe có vẻ thú vị phải không? Hãy cùng phân tích và giải quyết nó nhé!
Chào anh em, các ae có thể xem Đề bài và Solution của mình trên LeetCode nhé:
You are given two 0-indexed arrays, nums1
and nums2
, consisting of non-negative integers. There exists another array, nums3
, which contains the bitwise XOR of all pairings of integers between nums1
and nums2
(every integer in nums1
is paired with every integer in nums2
exactly once).
Return the bitwise XOR of all integers in nums3
.
Example 1:
Input: nums1 = [2,1,3], nums2 = [10,2,5,0] Output: 13 Explanation: A possible nums3 array is [8,0,7,2,11,3,4,1,9,1,6,3]. The bitwise XOR of all these numbers is 13, so we return 13.
Example 2:
Input: nums1 = [1,2], nums2 = [3,4] Output: 0 Explanation: All possible pairs of bitwise XORs are nums1[0] ^ nums2[0], nums1[0] ^ nums2[1], nums1[1] ^ nums2[0], and nums1[1] ^ nums2[1]. Thus, one possible nums3 array is [2,5,1,6]. 2 ^ 5 ^ 1 ^ 6 = 0, so we return 0.
Constraints:
1 <= nums1.length, nums2.length <= 10^5
0 <= nums1[i], nums2[j] <= 10^9
Khi nhìn vào bài này lần đầu, có thể nhiều người sẽ nghĩ đến cách brute force - tạo ra tất cả các cặp có thể và XOR chúng lại. Nhưng với constraints cho thấy nums1 và nums2 có thể lên tới 10^5 phần tử, cách này sẽ dẫn đến Time Limit Exceeded. Chúng ta cần một cách tiếp cận thông minh hơn! 💡
Hãy phân tích kỹ yêu cầu của bài toán:
Hãy lấy một ví dụ nhỏ để thấy pattern:
nums1 = [1,2]
nums2 = [3,4]
Liệt kê tất cả các cặp XOR:
(1⊕3), (1⊕4), (2⊕3), (2⊕4)
Phân tích kỹ hơn:
- Số 1 xuất hiện 2 lần (với 3 và 4)
- Số 2 xuất hiện 2 lần (với 3 và 4)
- Số 3 xuất hiện 2 lần (với 1 và 2)
- Số 4 xuất hiện 2 lần (với 1 và 2)
if (size1 % 2 == 1) { // nums1 có độ dài lẻ
→ mỗi số trong nums2 sẽ xuất hiện lẻ lần
→ cần XOR tất cả các số trong nums2
}
if (size2 % 2 == 1) { // nums2 có độ dài lẻ
→ mỗi số trong nums1 sẽ xuất hiện lẻ lần
→ cần XOR tất cả các số trong nums1
}
class Solution {
public:
int xorAllNums(vector<int>& nums1, vector<int>& nums2) {
int size1 = nums1.size();
int size2 = nums2.size();
int ans1 = 0, ans2 = 0;
// Xử lý khi nums1 có size lẻ
if (size1 % 2 == 1) {
for (int num : nums2) ans2 ^= num;
}
// Xử lý khi nums2 có size lẻ
if (size2 % 2 == 1) {
for (int num : nums1) ans1 ^= num;
}
return ans1 ^ ans2;
}
};
// Test Case 1:
Input: nums1 = [2,1], nums2 = [3,4]
Output: 0
Giải thích: (2⊕3)⊕(2⊕4)⊕(1⊕3)⊕(1⊕4) = 0
// Test Case 2:
Input: nums1 = [1,2,3], nums2 = [6,5]
Output: 6⊕5 = 3
Giải thích: Size nums1 lẻ -> XOR all nums2
Đó! Một bài toán tưởng phức tạp lại có solution cực kỳ elegant phải không anh em? 🚀
P/S: Nếu thích những bài phân tích kiểu này, đừng quên follow mình để đón những bài tiếp theo nhé! Happy coding! 💻✨
Code Editor