ペア番号の問題

しかし、週末のタスク! 彼女は洞察力を得るには多すぎて(インタビューでそのような質問を決してしないでください)、競争のために単純すぎるので、インタビューをするのに十分ではありません。 プログラミングが大好きな脳内で非常に満足のいくクリックを提供するためです。 だから:



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つを使用します。



コメントには、コードありとコードなしの多くの解決策もあります(以下にリストを示します)。

kmu1990からのソリューション

Ograソリューション

ZyXIソリューション

Demogorの スタートアップのタスクをどのように解決します

deniskreshikhinからのタスク開発

免責事項:この投稿は、 closedcircles.comのかなり編集されたチャットログに基づいて作成されたため、プレゼンテーションスタイルと明確な質問の可用性に基づいています。



All Articles