leetcode 137.只出现一次的数字II

57 阅读1分钟

137. 只出现一次的数字 II - 力扣(LeetCode)

image.png

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来写 拿这个测试用例举例:

image.png

如果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来写会有这种问题,唯一的值被覆盖:

image.png