- 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;
}
};