昨日、面接の質問が 2 つありました。最初の質問には多くの人が答えましたが、2 番目の質問にはほとんど答えられませんでした。最近 PHP を勉強しているので、この記事では PHP をベースにして 2 回目の分析をお届けします。
添付のインタビューの質問は2つです:
1:ホールには100個の照明があり、それぞれの照明には1から100までの番号が付いています。各ライトはスイッチによって制御されます。 (スイッチを1回押すとライトが点灯し、もう一度押すと消灯します。スイッチの番号は制御されているライトと同じです。) 最初はすべてのライトが消灯しています。次のルールに従ってスイッチを押してください。
初めてすべてのライトを点灯します。
2回目は2の倍数のスイッチをすべて押します。
3回目は、3の倍数のスイッチをすべて押します。
などなど。 N 回目は、N の倍数のスイッチをすべて押します。
ボタンを 100 回押した後、ホールにまだ点灯している照明が何個あるかを尋ねます。
2:27cmの細い木の棒があり、3cm、7cm、11cm、17cm、23cmの5つの位置にそれぞれアリがいます。木の棒は非常に細いので、同時にアリを通過することはできません。初めは、アリの頭が左を向いているか右を向いているかは任意で、アリは前進するか振り向くだけで、後退することはありませんでした。二匹のアリが出会うと、向きを変えて同時に反対方向に歩きます。アリが毎秒 1 センチメートル移動できると仮定します。すべてのアリが木の棒から離れる最小時間と最大時間を見つけるプログラムを作成してください。
1 つ目は比較的単純なので詳しくは説明しませんが、2 つ目は見ているだけで頭痛がしてしまいます。
この質問を簡単に分析してみましょう。
質問自体から判断すると、5 匹のアリの位置を同時に考えるのは非常に混乱しているようです。幸いなことに、質問の最後の文は依然として非常に役に立ちます。これは、すべてのアリが木の棒から離れる最大時間と最小時間です。細い棒を水平軸として使用します。アリの位置が指定されています。最後に離れるアリの位置が =27 の場合、すべてのアリが木の棒から離れます。 (ナンセンスのようです。)
秒速1メートル、このような問題設定だけで人々を安心させるのに十分です。結局のところ、アリがここで移動する時間は、アリが移動する距離と数値的に同じです。 (すべてのアリが木の棒から離れ、元の速度で移動し続けるとみなした場合)。そしてそれらは同時に動きます。
アリの移動方向は左右の 2 方向のみです。座標軸の実際の状況を考慮して、右への移動を 1 とすると、同等の左への移動は -1 となります。このステップをコンピューターのバイナリの世界で考えることが重要です。
さて、前は伏線ですが、理解できるかどうかは別として、ここからがより重要な内容です。
最大時間と最小時間を見つけることは、数字の山の中から最大値と最小値を見つけるのと同じことです。この種のことは難しいことではありません。重要なのは、最後に比較を行った時期を見つけることです。 時間は何かと何の関係があるのでしょうか?タイトルのデザインから判断すると、各アリの初期動作状態にのみ関係しているはずです。期間中のある瞬間における、あるアリの移動状況については、気にする必要があるでしょうか?必要なし。それは問題を複雑にするだけです。
アリの初期状態はいくつありますか? 2^5=32。明らかに、これら 32 種類のそれぞれに費やされる時間を計算する必要があり、単純なループを使用できます。
アリの移動状況に注目するのは、位置と方向の2つの変数に過ぎません。そこで、ここでは単純に 2 つの配列 $arr と $b を紹介します。前者は特定の点の現在位置を表すために使用され、後者は現在の方向を表すために使用されます。 $b[i]
前述したように、値は -1 または 1 のみである必要があります。
これを考慮すると、考え方を整理して、配列 '$arr' と '$b' に初期値を割り当てることができます。時間 '$i' を使用してループを作成し、各アリが毎秒移動した後、'$arr[$k]==$arr[$k-1]' のときに、一致する状態値 '$b[k ]' を変更します。価値。 すべての「$arr」の「値」が <=0 または >=27 の場合、ループを停止し、「$i」を返します。ループトラバーサルが多用されます。もちろん、簡単にするために、'$arr[$k]' がポール上になくなったら、unset() 関数を使用してそれを削除できます。最後に、'$arr'が空であると判断してループを終了します。
メインの内容を話した後、まだ細かい作業が必要ですが、アリの移動状況を記述する配列「$b」を生成する方法は?
手動で生成することはできません。 5 アリの場合、10 アリの場合は 1024 の状況を生成するのは非常に困難です。ただし、32 個の配列を生成する必要があることは明らかなので、それを使用する必要があります。したがって、10 進数を長さ 5 の 2 進数に変換することは容易に考えられます。次に、この 2 進数の 0 を -1 に置き換えます。置換された文字列を配列に変換します。
最後に、対応するコードを貼り付けます:
<?<span>php </span><span>for</span>(<span>$j</span>=0;<span>$j</span><32;<span>$j</span>++<span>){ </span><span>$var</span>=<span>sprintf</span>("%05b", <span>$j</span><span>); </span><span>$var</span>=<span>str_replace</span>('1', '1|', <span>$var</span><span>); </span><span>$var</span>=<span>str_replace</span>('0', '-1|', <span>$var</span><span>); </span><span>$b</span>=<span>explode</span>('|',<span>$var</span><span>); </span><span>$res</span>=getRes(<span>$b</span><span>); </span><span>if</span> (<span>isset</span>(<span>$min</span><span>)) { </span><span>if</span> (<span>$res</span><<span>$min</span><span>) { </span><span>$min</span>=<span>$res</span><span>; } }</span><span>else</span><span>{ </span><span>$min</span>=<span>$res</span><span>; } </span><span>if</span> (<span>isset</span>(<span>$max</span><span>)) { </span><span>if</span> (<span>$res</span>><span>$max</span><span>) { </span><span>$max</span>=<span>$res</span><span>; } }</span><span>else</span><span>{ </span><span>$max</span>=<span>$res</span><span>; } </span><span>print_r</span>(<span>$b</span><span>); </span><span>echo</span> "此次结果是".<span>$res</span>.' $max='.<span>$max</span>.' $min='.<span>$min</span><span>; </span><span>echo</span> "<hr/>"<span>; } </span><span>echo</span> "最大值是".<span>$max</span>."最小值是".<span>$min</span><span>; </span><span>//</span><span>获得某种情况下的时间</span><span>function</span> getRes(<span>$b</span><span>){ </span><span>$arr</span>=<span>array</span>(3,7,11,17,23<span>); </span><span>for</span>(<span>$i</span>=1;<span>$i</span><100;<span>$i</span>++<span>){ </span><span>foreach</span> (<span>$arr</span><span>as</span><span>$k</span> => <span>$val</span><span>) { </span><span>$arr</span>[<span>$k</span>]=<span>$val</span>+<span>$b</span>[<span>$k</span><span>]; </span><span>if</span> (<span>$arr</span>[<span>$k</span>]==@<span>$arr</span>[<span>$k</span>-1<span>]) { </span><span>$b</span>[<span>$k</span>]=-<span>$b</span>[<span>$k</span><span>]; </span><span>$b</span>[<span>$k</span>-1]=-@<span>$b</span>[<span>$k</span>-1<span>]; } </span><span>if</span> ((<span>$arr</span>[<span>$k</span>]>=27)||(<span>$arr</span>[<span>$k</span>]<=0<span>)) { </span><span>unset</span>(<span>$arr</span>[<span>$k</span><span>]); } } </span><span>if</span> (<span>empty</span>(<span>$arr</span><span>)) { </span><span>return</span><span>$i</span><span>; } } }</span>
PHPは数学的演算が苦手で、作者も数学的演算が苦手です。上で書いたコードだけでかろうじてタスクを完了できるような気がします。またご指導いただければ幸いです。
上記は、関連する側面も含めて、面接での痛ましい質問を紹介しています。PHP チュートリアルに興味のある友人の参考になれば幸いです。