雙周賽88。最近周賽常常出現什麼位元XOR、OR還是AND,快麻痺了。

題目

輸入兩個由非負整數組成的陣列nums1和nums2。存在另一個陣列nums3,由nums1和nums2之間的所有整數數對的位元XOR結果所組成(nums1中每個整數與nums2中的每個整數恰好配對一次)。

回傳nums3中所有XOR後的總和。

解法

XOR最重要的特性就是兩兩相消。
每個nums1[i]都會和每個nums2[j]組成數對。如果nums2的長度為偶數,所有nums1[i]都會被相消掉;同理,如果nums1的長度為偶數,所有nums2[j]都會被相消掉。

釐清概念後就很簡單了。答案從0開始,如果nums2為奇數,則把nums1所有數字XOR進去;如果nums1為奇數,則把nums2所有數字XOR進去。

時間複雜度O(M+N),空間複雜度O(1)。

class Solution:
    def xorAllNums(self, nums1: List[int], nums2: List[int]) -> int:
        M=len(nums1)
        N=len(nums2)
        ans=0
        
        if M&1:
            for n in nums2:
                ans^=n
                
        if N&1:
            for n in nums1:
                ans^=n

        return ans