二つの数の整数型配列に加えて、他の数字が二回表示されます。
これら二つの図が表示されるだけで検索するプログラムを作成してください。
次の2つの数字がなければならないと仮定することができます。
サンプル
入力:[1,2,3,3,4,4]
出力:[1,2]
アイデア:
シンプルなアイデアは、余分なスペースを費やすことです。
問題を解決するには、排他的論理和演算を使用することです:
- XORは二回0の数であります
- すべてのXORを再び得た合計=のx ^ yの
- その合計を確保するためのk、k番目のビットを取ります
- 再びベクトルトラバーサル、もしXORの数のk番目のビット。操作の後、構造体は、最初の答えです
- 第二の答えは、和XORの最初の答えです。
class Solution {
public:
vector<int> findNumsAppearOnce(vector<int>& nums) {
int sum = 0;
for(auto x: nums) {
sum ^= x;
}
int k = 0;
while(!((sum >> k) & 1)) k++;
int ans = 0;
for(auto x: nums) {
if((x >> k) & 1) ans ^= x;
}
return vector<int>{ans,sum ^ ans};
}
};