【4月打卡】面試題56 - I. 數組中數字出現的次數

題目

個人認爲是Leetcode-136 只出現一次的數字的升級版
136中只有一個數字只出現一次,本題中有兩個
因此136的方法爲求異或和,本題爲求異或和+分組

這個分組就是本題的關鍵點
例如:nums = [1,2,10,4,1,4,3,3] 異或和:ans=8ans反映了2和10 的不同位數
2:0001 10:0101 ans=8(0100)
取出任意一個不爲0的位,這裏是讓help與ans進行&運算尋找
使用help^nums[i]進行分組,相同的數一定會被分到一組,並且經過異或運算後消失,這樣兩個組的結果即爲只出現了一次的兩個數。

class Solution {
public:
    vector<int> singleNumbers(vector<int>& nums) {
        int ans=nums[0];
        int a=0,b=0,help=1;
        for(int i=1;i<nums.size();i++)
            ans=(ans^nums[i]);
        while((help&ans)==0)
        {
            help=help<<1;
        }
        for(int i=0;i<nums.size();i++)
        {
            if((nums[i]&help)!=0)
                a=a^nums[i];
            else
                b=b^nums[i];
        }
        return {a,b};
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章