本文主要是介绍稀碎从零算法笔记Day13-LeetCode:只出现一次的数字 II,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题型:数组、哈希表、位运算
链接:137. 只出现一次的数字 II - 力扣(LeetCode)
来源:LeetCode
题目描述
给你一个整数数组 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
中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
题目思路
这个题是“二代目” 之前有个“一代目”版本是都出现两次,这样可以位运算:将数组中所有元素都异或^起来(因为与 0 异或还是自己本身),这样最终得到的数就是就是只有一次的。但是如果都出现3次,那都异或就不管用了.
这里笔者想了半天最终决定回归哈希(用unordered_map来实现,因为要同时知道数字以及出现次数)。
哈希表的话题目就直接了一点:unordered_map来存<数字,出现次数> 然后使用迭代器来遍历unordered_map,如果当前指向的键值对的second==1,那就返回这个键值对的first
C++代码
哈希方法
class Solution {
public:int singleNumber(vector<int>& nums) {// 哈希表unordered_map<int,int> hash;for(int num : nums){hash[num]++;//hash的中括弧内 是key}int answer=0;// 迭代器之间不能用< > ,可以使用!= 或者 ==for(auto inte=hash.begin();inte!=hash.end();inte++)//遍历unordered_map 要使用迭代器{if(inte->second==1){answer=inte->first;break;}}return answer;}
};
结算页面
这篇关于稀碎从零算法笔记Day13-LeetCode:只出现一次的数字 II的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!