Given an array of integers, every element appears twice except for one. Find that single one.
大意就是,别的数字都成双成对,只有一个数字孤身一人。【别名:寻找单身狗】
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
线性还好做,但是不用extra memory 没有思路啊;
public static int singleNumber(int[] nums) {
Set<Integer> set=new HashSet<Integer>();
for(int i=0;i<nums.length;i++){
if(set.contains(nums[i])){
set.remove(nums[i]);
}else{
set.add(nums[i]);
}
}
return (int)set.toArray()[0];
}
思路就是维护一个set来一个加一个,再来一个就把原来的领走了。
这个就比较基本了
但是怎么实现不用extra memory呢
这里就使用到了异或的操作
0^X=X
X^X=0
这就是基本原理
所以所有的数字都两两组合
(X1^X1)^(X2^X2)^......^X=0^0^0...^X=X
这就得到了孤零零的X
public int singleNumber(int[] nums) {
int ans =0;
for(int i=0;i!=nums.length;i++)
ans ^= nums[i];
return ans;
}