目标
给你一个数组 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 中每个数字要么出现过一次,要么出现过两次。
思路
有一个数组 nums
,其中的元素要么出现一次,要么出现两次。求出现两次的元素的异或值,如果没有则返回 0。
由于 nums[i] <= 50
,可以使用数组记录元素是否出现过,如果它第二次出现则计算异或值。
网友题解则使用了 long 型变量作为 bitmap 标识是否已经出现过。空间复杂度降为 O(1)
。
代码
/**
* @date 2024-10-12 8:46
*/
public class DuplicateNumbersXOR3158 {
public int duplicateNumbersXOR(int[] nums) {
// nums[i] <= 50
boolean[] seen = new boolean[51];
int res = 0;
for (int num : nums) {
if (seen[num]) {
res ^= num;
} else {
seen[num] = true;
}
}
return res;
}
}