3158. 求出出现两次数字的 XOR 值
题目描述
给你一个数组 nums
,数组中的数字 要么 出现一次,要么 出现两次。
请你返回数组中所有出现两次数字的按位 XOR
值,如果没有数字出现过两次,返回 0 。
示例 1:
输入:nums = [1,2,1,3]
输出:1
解释:
nums
中唯一出现过两次的数字是 1 。
示例 2:
输入:nums = [1,2,3]
输出:0
解释:
nums
中没有数字出现两次。
示例 3:
输入:nums = [1,2,2,1]
输出:3
解释:
数字 1 和 2 出现过两次。1 XOR 2 == 3
。
提示:
1 <= nums.length <= 50
1 <= nums[i] <= 50
nums
中每个数字要么出现过一次,要么出现过两次。
解法
方法一:计数
我们定义一个数组或哈希表 \(\textit{cnt}\) 记录每个数字出现的次数。
接下来,遍历数组 \(\textit{nums}\),当某个数字出现两次时,我们将其与答案进行异或运算。
最后返回答案即可。
时间复杂度 \(O(n)\),空间复杂度 \(O(M)\)。其中 \(n\) 是数组 \(\textit{nums}\) 的长度,而 \(M\) 是数组 \(\textit{nums}\) 中的最大值或数组 \(\textit{nums}\) 不同数字的个数。
1 2 3 4 |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 |
|
1 2 3 4 5 6 7 8 9 10 |
|
方法二:位运算
由于题目中给出的数字范围是 \(1 \leq \textit{nums}[i] \leq 50\),我们可以使用一个 \(64\) 位的整数来存储每个数字的出现次数。
我们定义一个整数 \(\textit{mask}\) 来记录每个数字是否出现过。
接下来,遍历数组 \(\textit{nums}\),当某个数字出现两次时,即 \(\textit{mask}\) 的二进制表示中第 \(x\) 位为 \(1\) 时,我们将其与答案进行异或运算。否则,我们将 \(\textit{mask}\) 的第 \(x\) 位设置为 \(1\)。
最后返回答案即可。
时间复杂度 \(O(n)\),其中 \(n\) 是数组 \(\textit{nums}\) 的长度。空间复杂度 \(O(1)\)。
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
|