配列を指定して、配列に1回だけ表示される番号を探します(Likou 136)

  1. 1回だけ表示される数値
    空でない整数配列を指定すると、1回だけ表示される1つの要素を除いて、他のすべての要素が2回表示されます。1回だけ表示される要素を見つけます。

説明:

アルゴリズムは線形の時間計算量を持つ必要があります。余分なスペースを使わずにそれを行うことができますか?

例1:
入力:[2,2,1]
出力:1

例2:
入力:[4,1,2,1,2]
出力:4

-ハッシュ

最近、ハッシュデータ構造について学びました。最初の反応は、ハッシュテーブルを使用してカウントすることでした。配列をトラバースした後、ハッシュをトラバースして、出現回数が1の要素を見つけます。時間の複雑さはO(N )、およびスペースの複雑さはO(N)です。

class Solution {
    
    
public:
    int singleNumber(vector<int>& nums) {
    
    
     unordered_map<int, int> hash;//key值为元素值,val放出现次数
        int len = nums.size();
        for (int i = 0; i < len; i++) {
    
    
            unordered_map<int, int>::iterator it = hash.find(nums[i]);
            if (it == hash.end())//哈希表中无该数
                hash[nums[i]] = 1;//将该数的val置1
            else {
    
    
                hash[nums[i]]++; //若已经存在,val加一
            }
        }
        for (auto val : hash) {
    
    //将hash表中所有数据进行遍历,寻找出现次数为1的元素
            if (val.second == 1)
                return val.first;
        }
        return 0;
    }
};

-ビット演算
問題の解決策を読んだ、別の微妙な演算があることを思い出しました。排他的論理和、同じことは誤りですが、違いは真実です。具体的な演算は次のとおりです。

可換法則:a ^ b ^ c <=> a ^ c ^ b

XOR0の任意の数は任意の数0 ^ n => n

同じ番号のXORは0です:n ^ n => 0
例:
ここに画像の説明を挿入

var a = [2,3,2,4,4]
2 ^ 3 ^ 2 ^ 4 ^ 4は2 ^ 2 ^ 4 ^ 4 ^ 3 => 0 ^ 0 ^ 3 => 3と同等です

class Solution {
    
    
public:
    int singleNumber(vector<int>& nums) {
    
    
     int ans=0;
     for(auto num:nums)
        ans^=num;
        
        return ans;
    }
};

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/Genius_bin/article/details/113103176