タスク1.プログラマーの甘やかさを確認する
1からNまでの番号の順序付けられたシーケンスが与えられた場合、1つの番号が削除され、残りの番号は混合されました。 リモート番号を見つけます。
「順序付けられたシーケンス」という句は1つだけ紛らわしいため、ソートを使用してこの問題を解決することができます。 プログラマーは既製のライブラリとフレームワークを使用することが多いため、問題を解決する際に、ライブラリから何を使用するかを自動的に考えます。 多くのプログラマにとって、唯一の明らかな解決策は、結果のシーケンスをソートし、最初の不一致まで元のシーケンスとソートされたシーケンスの要素ごとの比較を行うことです。 このようなソリューションの複雑さを計算できます。 ソートの複雑さと線形検索の複雑さ。 うーん、それは何らかの形でソリューションにアプローチできますか?
より簡単な解決策があります。
シーケンスが順序付けられていることを忘れましょう。 両方のシーケンスの違いは1つだけです。つまり、それを見つけるには、元のシーケンスの要素の合計から取得した量を減算する必要があります。 ちなみに、すべての要素が一意である場合、元の配列には算術級数があり、最初の合計は次のように計算できます 。
タスク2.数字のジャグリング
あなたは5リットルと3リットルの水差しと無制限の量の水を持っています。 正確に4リットルの水を測定する方法は? 水差しの形状は不規則であるため、水差しの半分を正確に測定することはできません。
これは私のお気に入りのパズルゲームです。 一方では、少し考える必要があり、他方では、それは本当にシンプルで適切です。
解決策
ここで、素数5と3を少し調整する必要があります。
1. 3リットルの水差しを満たします。 これらの3リットルを5リットルの水差しに注ぎます。
2.再度、3リットルの水差しを満たし、そこから5リットルの水差しに注ぎます。 5リットルの水差しには3リットルがあり、完全に満たされるまで2リットルが別の水差しから注がれることに注意してください。 3リットルの水差しには、1リットルが残っていました。
3. 5リットルの水差しを空にします。 測定された1リットルを注ぎます。 繰り返しますが、3リットルの水差しを満たし、そこから5リットルの水差しに注ぎます。 現在、大きな水差しに4リットルの水があります。
1. 3リットルの水差しを満たします。 これらの3リットルを5リットルの水差しに注ぎます。
2.再度、3リットルの水差しを満たし、そこから5リットルの水差しに注ぎます。 5リットルの水差しには3リットルがあり、完全に満たされるまで2リットルが別の水差しから注がれることに注意してください。 3リットルの水差しには、1リットルが残っていました。
3. 5リットルの水差しを空にします。 測定された1リットルを注ぎます。 繰り返しますが、3リットルの水差しを満たし、そこから5リットルの水差しに注ぎます。 現在、大きな水差しに4リットルの水があります。
タスク3.仲介なし
2つの数字があります。 追加の変数を使用せずにそれらを交換することは可能ですか?
結局のところ、これは非常に人気のあるパズルです。 しかし、私は重大な欠陥で決定しました。
算術演算またはビット演算を使用して問題を解決できます。 算術は簡単に見えるので、私はそれらを使用することにしました。
解決策
AとBがあるとします。
A = A + B
B = A-B //その後、BはAになります。 実際、(A + B)-B = Aを取得します
A = A-B
この決定には大きなマイナス点があります。オーバーフローの可能性です。 したがって、XORビット演算を使用することをお勧めします。
A = A ^ B
B = A ^ B
A = A ^ B
仕組み:最初の行では、異なるビットのマスクを取得します。これらの数字には1があります。 次に、必要なビットがリセットされ、値の交換に設定されます。
たとえば、より明確になります。 番号5と9の交換を検討してください。
A = 0101 ^ 1001 = 1100
B = 1100 ^ 1001 = 0101
A = 1100 ^ 0101 = 1001
A = A + B
B = A-B //その後、BはAになります。 実際、(A + B)-B = Aを取得します
A = A-B
この決定には大きなマイナス点があります。オーバーフローの可能性です。 したがって、XORビット演算を使用することをお勧めします。
A = A ^ B
B = A ^ B
A = A ^ B
仕組み:最初の行では、異なるビットのマスクを取得します。これらの数字には1があります。 次に、必要なビットがリセットされ、値の交換に設定されます。
たとえば、より明確になります。 番号5と9の交換を検討してください。
A = 0101 ^ 1001 = 1100
B = 1100 ^ 1001 = 0101
A = 1100 ^ 0101 = 1001
みなさんにインタビューの成功を祈るだけです!
また、コメントには、あなたが出会ったタスクを書くことができます。