Map記錄數字出現的次數
代碼
/**
* HashMap 集合
* 23ms
*/
public int singleNumber(int[] nums) {
Map<Integer,Integer> map=new HashMap<>();
for(int num:nums){
if(map.containsKey(num)){
map.put(num,map.get(num)+1);
}else{
map.put(num,1);
}
}
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
if(entry.getValue()==1){
return entry.getKey();
}
}
return 0;
}
遍歷統計每一位
思路
-
在數字的二進制形式下,對於出現三次的數字,各二進制位出現的次數都是3的倍數。
-
統計所有數字的各個二進制中1的出現的次數,對3求余,結果則為只出現一次的數字
-
詳細思路如下:
-
-
時間復雜度 O(N) :其中 N位數組 nums的長度;遍歷數組占用 O(N) ,每輪中的常數個位運算操作占用 O(1)
-
空間復雜度 O(1)
-
修改求余數值m,即可解決除了一個數字以外,其他數字都出現m次的通用問題。
代碼
/*
* 5ms
*/
public int singleNumber3(int[] nums) {
int[] counts=new int[32];
for(int num:nums){
for(int j=0;j<32;j++){ //從低位往高位統計
counts[j]+=num&1;
num>>>=1; //無符號右移
}
}
int res=0,m=3;
for(int i=0;i<32;i++){
res<<=1; //左移 從高位往低位“累加”
res|=counts[31-i]%m;
}
return res;
}
狀態機
原文鏈接: