N 32- . , -- . ( ).
コメントの決定には<spoiler>タグを使用することを忘れないでください!
簡単な解決策:4Gビットでゼロビットマップを開始します(一定のメモリ!)。 特定の番号が表示された場合、排他的またはその位置にある番号を使用します。 最終的に、2ビットのみが1に等しくなります-これらは私たちが探していた数字です。 追加の配列の1つのパスでそれらを見つけることができます。
トロールしないでください:)矛盾を避けましょう-4キロバイトのメモリがあります。
一つの解決策
簡単にわかるように、ペア番号は問題がxorに関係していることを示唆しています。
目的の数値をXとYにします。配列内のすべての数値をxまたはxだけにすると、結果がX ^ Yになることは明らかです。これは、他のすべての数値が削減されるため良いですが、計算できないため悪いです。 どうする
数値XとYが異なるビットを事前に知っていた場合(そのようなビットが必要である)、タスクは単純に解決されることに注意してください-ビットNで1とするすべての数値をxまたは すべてのペアの数値が削減され、結果はXまたはYになります。また、値X ^ Yがある場合、2番目の数値は簡単に計算できます。
さらに、X ^ Yがある場合、これはどのビットXとYが異なるかを示します-xor 1
1つのパスでこれを行う方法を理解することは残っています。
通過中にxorすべての数字と32個のバッテリーを渡しましょう。 i番目のバッテリーでは、i番目のビットに1があるすべての数値のxorを累積します。 最終的に、ビットが異なるバッテリーの1つを使用します。
目的の数値をXとYにします。配列内のすべての数値をxまたはxだけにすると、結果がX ^ Yになることは明らかです。これは、他のすべての数値が削減されるため良いですが、計算できないため悪いです。 どうする
数値XとYが異なるビットを事前に知っていた場合(そのようなビットが必要である)、タスクは単純に解決されることに注意してください-ビットNで1とするすべての数値をxまたは すべてのペアの数値が削減され、結果はXまたはYになります。また、値X ^ Yがある場合、2番目の数値は簡単に計算できます。
さらに、X ^ Yがある場合、これはどのビットXとYが異なるかを示します-xor 1
1つのパスでこれを行う方法を理解することは残っています。
通過中にxorすべての数字と32個のバッテリーを渡しましょう。 i番目のバッテリーでは、i番目のビットに1があるすべての数値のxorを累積します。 最終的に、ビットが異なるバッテリーの1つを使用します。
コメントには、コードありとコードなしの多くの解決策もあります(以下にリストを示します)。
kmu1990からのソリューション
Ograソリューション
ZyXIソリューション
Demogorの スタートアップのタスクをどのように解決します か
deniskreshikhinからのタスク開発
免責事項:この投稿は、 closedcircles.comのかなり編集されたチャットログに基づいて作成されたため、プレゼンテーションスタイルと明確な質問の可用性に基づいています。