ACWING73。配列は、(安全プランを証明するために)二つの数値に一度だけ表示されます

二つの数の整数型配列に加えて、他の数字が二回表示されます。

これら二つの図が表示されるだけで検索するプログラムを作成してください。

次の2つの数字がなければならないと仮定することができます。

サンプル
入力:[1,2,3,3,4,4]

出力:[1,2]

アイデア:
シンプルなアイデアは、余分なスペースを費やすことです。

問題を解決するには、排他的論理和演算を使用することです:

  1. XORは二回0の数であります
  2. すべてのXORを再び得た合計=のx ^ yの
  3. その合計を確保するためのk、k番目のビットを取ります
  4. 再びベクトルトラバーサル、もしXORの数のk番目のビット。操作の後、構造体は、最初の答えです
  5. 第二の答えは、和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};
    }
};
公開された843元の記事 ウォン称賛28 ビュー40000 +

おすすめ

転載: blog.csdn.net/tomjobs/article/details/104996973