題目描述
給你一個整數陣列 nums ,除某個元素僅出現 一次 外,其餘每個元素都恰出現 三次 。請你找出並返回那個只出現了一次的元素。
你必須設計並實現線性時間複雜度的演算法且使用常數級空間來解決此問題。
示例 1:
輸入:nums = [2,2,3,2]
輸出:3
示例 2:
輸入:nums = [0,1,0,1,0,1,99]
輸出:99
提示:
1 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
nums 中,除某個元素僅出現 一次 外,其餘每個元素都恰出現 三次
題目解析
這個題目可以使用位運算來解決,但我的位運算功力還沒有深到能夠解決3個相同的數字出現。所以在這裡我選擇使用雜湊表來解決這個問題,雜湊表有一個優勢就是邏輯上來說比較直觀,但是因為需要遍歷雜湊表所以執行效率肯定是要受到不小的影響的。
首先我們應該能想到這道題的關鍵在於數字和它的出現次數,所以我們可以使用HashMap來儲存一個數字和它的出現次數。
Map<Integer,Integer> numsList = new HashMap<>();
每次我們第一次遇到一個數字的時候,就在Map裡面存一個數字,並將它的出現次數設定為1,如果出現過第n(n>0)次,就將出現次數+1。
最後我們遍歷雜湊表看誰的出現次數為1,就可以得到目標數字了。
程式碼展示
class Solution {
public int singleNumber(int[] nums) {
Map<Integer,Integer> numsList = new HashMap<>();
for(int num:nums){
if(numsList.containsKey(num)){
int value = numsList.get(num);
value++;
numsList.put(num,value);
}else{
numsList.put(num,1);
}
}
int ans = 0;
for (Map.Entry<Integer,Integer> entry: numsList.entrySet()){
int num = entry.getKey();
int occ = entry.getValue();
if(occ == 1){
ans = num;
break;
}
}
return ans;
}
}