3158. 求出出现两次数字的 XOR 值
题干
给你一个数组 nums
,数组中的数字 要么 出现一次,要么 出现两次。
请你返回数组中所有出现两次数字的按位 XOR
值,如果没有数字出现过两次,返回 0 。
示例 1:
**输入:**nums = [1,2,1,3]
**输出:**1
解释:
nums
中唯一出现过两次的数字是 1 。
示例 2:
**输入:**nums = [1,2,3]
**输出:**0
解释:
nums
中没有数字出现两次。
题解
public static int duplicateNumbersXOR(int[] nums) {Set<Integer> set = new HashSet<>();int tmp = 0;for (int i = 0; i < nums.length; i++) {if(set.contains(nums[i])) {tmp ^= nums[i];}set.add(nums[i]);}return tmp;}
最大只有50,long类型有64位,用位运算代替hash
public static int duplicateNumbersXOR(int[] nums) { long set = 0L; int tmp = 0; for (int i = 0; i < nums.length; i++) { if ((set & (1L << nums[i])) > 0) { // 有记录 tmp ^= nums[i]; } else { set |= (1L << nums[i]); // 记录 } } return tmp;
}
总结
比较简单,没啥好总结的,官方水题目,我也水文章
可以当作练习位运算