问题
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
例子
思路
-
方法1 O(n) O(n)
map
-
方法2 O(nlogn) O(1)
先排序
-
方法3 O(n) O(1)
^和&~的区别
== 相当于搞了一个三进制出来。==
出现一次n时,让one为n【此时two为0】,出现两次n时,让two为n【此时one为0】,出现三次n时,one=0,two=0
one=(one^n) & ~two;//two为0时,one为n
two=(two^n) & ~one;//one为n时,two为0
最开始:one=0,two=0
出现第一次时:
one=(0^n) &~ 0=n &~ 0=n
two=(0^n) &~ n=n &~ n=0
出现第二次时:
one=(n^n) &~ 0=0 &~ 0=0
two=(0^n) &~ 0=n &~ 0=n
出现第三次时:
one=(0^n) &~ n=n &~ n=0
two=(n^n) &~ 0=0 &~ 0=0
代码
//方法1
class Solution {
public int singleNumber(int[] nums) {
Map<Integer,Integer> map = new HashMap<>();
for(int n:nums)
map.put(n,map.getOrDefault(n,0)+1);
for(int n: map.keySet())
if(map.get(n)==1) return n;
return -1;
}
}
//方法2
class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums);
int i=0;
for(i=0; i+2<nums.length; i=i+3) {
if(nums[i]!=nums[i+2]) return nums[i];
}
return nums[i];
}
}
//方法3
class Solution {
public int singleNumber(int[] nums) {
int one=0,two=0;
for(int n:nums){
one=(n^one) &~ two;
two=(n^two) &~ one;
}
return one;
}
}