题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
要求:线性时间复杂度,最好不用额外空间。
1.位运算:异或
Time:O(n)
异或运算性质:
- 任何数和0做异或运算,结果仍然是原来的数,即 a⊕0=a。
- 任何数和其自身做异或运算,结果是 00,即 a⊕a=0。
- 异或运算满足交换律和结合律,即a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。
#python
class Solution:
def singleNumber(self,nums):
return lambda(x,y:x^y,nums)
2.Hash集
Time:O(n)
哈希集:不包含任务重复元素的无序集合
//java
class Solution{
public int singleNumber(int[] nums){
Map<Integer,Integer> map = new HashMap<>();
for(Integer i : nums){
Integer count = count == null ? 1 : ++count;
map.put(i,count);
}
for(Integer i : map.keySet()){
count = map.get(i);
if(count == 1){
return i;
}
}
return -1; //没找到
}
}
3.快排
Time:O(nlog(n))
相关链接:
【1】排序
【2】哈希集