137. 只出现一次的数字 II - 力扣(LeetCode)
map
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int,int> OnceMap;
for(auto ch:nums)
{
OnceMap[ch]++; //是将num作为key,对应的value加1。这样就可以统计每个数字出现的次数了。
}
unordered_map <int,int>::iterator it=OnceMap.begin();
int result=0;
for( ;it!=OnceMap.end();it++)
{
if(it->second==1)
{
result=it->first;
return result;
}
}
return -1;// 如果没有只出现一次的数字,则返回-1
}
};
set
要用两个set来写 拿这个测试用例举例:
如果o1里面有2,就从O1里把2删除,然后把2放S2里面。 否则就把2放O1里。 当第一个2放到O1里后,O1再碰见2都会从O1里把2删除,然后把2放进S2里。
当O1遇见3时,此时O1里面是空的,S2里面有3个2.
O1里面没3,放S2,S2里面也没3,再放O1
此时返回O1的第一个元素即可。
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_set<int> onceSet;
unordered_set<int> twiceSet;
for(int num : nums) {
if(onceSet.count(num)) {
onceSet.erase(num);
twiceSet.insert(num);
} else if(twiceSet.count(num)) {
twiceSet.erase(num);
} else {
onceSet.insert(num);
}
}
return *onceSet.begin();
}
};
如果只用一个set来写会有这种问题,唯一的值被覆盖: