Given a non-empty 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?
Example 1:
Input: [2,2,1]
Output: 1
Example 2:
Input: [4,1,2,1,2]
Output: 4
思路
拿到题首先想到的是把数组存进hashmap然后找出value为1的,但是做了以后发现时间复杂度太复杂
然后想到把数组排序然后两两比较,但是这也也不够快
最后看到大神解法
,我们看看它做了什么,先设定一个0,然后循环和数组中的每个数去做异或运算,每次得出的结果都继续和下一个数再异或。最后得出来的结果就是单个的那个数了!为什么?我演算了一下希望找到规律,发现确实如此。因为异或这个运算有三个很重要的特性:
两个相同的数异或后为0;
0和一个数异或后为那个数;
异或运算满足交换律。
————————————————
int result =0;
for(int j = 0; j< nums.length;j++){
result ^= nums[j];
}
return result;
知识点
java异运算
java异或运算
class Solution {
public int singleNumber(int[] nums) {
/* 方法一:存入hashmap
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i =0;i < nums.length;i++){
if(map.containsKey(nums[i])){
map.put(nums[i],map.get(nums[i])+1);
}
else{
map.put(nums[i],1);
}
}
int res = 0;
for(int j = 0; j< nums.length;j++){
if(map.get(nums[j]) == 1){
res= nums[j];
break;
}
}
return res;
*/
int result =0;
for(int j = 0; j< nums.length;j++){
result ^= nums[j];
}
return result;
}
}```