思路1:
使用set集合,将nums[]中的数据向set添加,添加前先判断set中是否存在该数,存在就消去,不存在就添加,最后set中就会只剩一个数,就是只出现一次的数字
class Solution {
public int singleNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
for(int i:nums){
if(set.contains(i)){
set.remove(i);
}else{
set.add(i);
}
}
int res = 0;
for(int i:set){
res=i;
}
return res;
}
}
思路2:
使用 异或XOR:
- 交换律:a ^ b ^ c <=> a ^ c ^ b
- 任何数于0异或为任何数 0 ^ n => n
- 相同的数异或为0: n ^ n => 0
public int singleNumber(int[] nums) {
int res = 0;
for(int i=0;i<=nums.length-1;i++){
res^=nums[i];
}
return res;
}
- 异或:不同则为1
a^b
- 同或:相同则为1
(a^b)^1