只出现一次的数字 II
题目描述
给你一个整数数组 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;
}
}