力扣(leetcode)每日一题 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;
}
总结
比较简单,没啥好总结的,官方水题目,我也水文章
可以当作练习位运算
原文地址:https://blog.csdn.net/ganjiee0007/article/details/142891157
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!