検索

痛ましい面接の質問

昨日、面接の質問が 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」の「値」が =27 の場合、ループを停止し、「$i」を返します。ループトラバーサルが多用されます。もちろん、簡単にするために、'$arr[$k]' がポール上になくなったら、unset() 関数を使用してそれを削除できます。最後に、'$arr'が空であると判断してループを終了します。

メインの内容を話した後は、

アリの移動状況を記述する配列 "$b" を生成する方法?

手動で生成することはできません。 5 アリの場合は 32 の状況があり、10 アリの場合は 1024 の状況があります。手動で生成するのは非常に面倒です。ただし、32 個の配列を生成する必要があることは明らかなので、それを使用する必要があります。したがって、10 進数を長さ 5 の 2 進数に変換することは容易に考えられます。次に、この 2 進数の 0 を -1 に置き換えます。置換された文字列を配列に変換します。

対応するコードを貼り付けます:

<span style="color: #000000;">php</span><span style="color: #0000ff;">for</span>(<span style="color: #800080;">$j</span>=0;<span style="color: #800080;">$j</span>$j++<span style="color: #000000;">){    </span><span style="color: #800080;">$var</span>=<span style="color: #008080;">sprintf</span>("%05b", <span style="color: #800080;">$j</span><span style="color: #000000;">);    </span><span style="color: #800080;">$var</span>=<span style="color: #008080;">str_replace</span>('1', '1|', <span style="color: #800080;">$var</span><span style="color: #000000;">);    </span><span style="color: #800080;">$var</span>=<span style="color: #008080;">str_replace</span>('0', '-1|', <span style="color: #800080;">$var</span><span style="color: #000000;">);    </span><span style="color: #800080;">$b</span>=<span style="color: #008080;">explode</span>('|',<span style="color: #800080;">$var</span><span style="color: #000000;">);    </span><span style="color: #800080;">$res</span>=getRes(<span style="color: #800080;">$b</span><span style="color: #000000;">);    </span><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$min</span><span style="color: #000000;">)) {        </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$res</span>$min<span style="color: #000000;">) {            </span><span style="color: #800080;">$min</span>=<span style="color: #800080;">$res</span><span style="color: #000000;">;        }    }</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{        </span><span style="color: #800080;">$min</span>=<span style="color: #800080;">$res</span><span style="color: #000000;">;    }    </span><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$max</span><span style="color: #000000;">)) {        </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$res</span>><span style="color: #800080;">$max</span><span style="color: #000000;">) {            </span><span style="color: #800080;">$max</span>=<span style="color: #800080;">$res</span><span style="color: #000000;">;        }    }</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{        </span><span style="color: #800080;">$max</span>=<span style="color: #800080;">$res</span><span style="color: #000000;">;    }    </span><span style="color: #008080;">print_r</span>(<span style="color: #800080;">$b</span><span style="color: #000000;">);    </span><span style="color: #0000ff;">echo</span> "此次结果是".<span style="color: #800080;">$res</span>.'   $max='.<span style="color: #800080;">$max</span>.'  $min='.<span style="color: #800080;">$min</span><span style="color: #000000;">;    </span><span style="color: #0000ff;">echo</span> "<hr>"<span style="color: #000000;">;}</span><span style="color: #0000ff;">echo</span> "最大值是".<span style="color: #800080;">$max</span>."最小值是".<span style="color: #800080;">$min</span><span style="color: #000000;">;</span><span style="color: #008000;">//</span><span style="color: #008000;">获得某种情况下的时间</span><span style="color: #0000ff;">function</span> getRes(<span style="color: #800080;">$b</span><span style="color: #000000;">){    </span><span style="color: #800080;">$arr</span>=<span style="color: #0000ff;">array</span>(3,7,11,17,23<span style="color: #000000;">);    </span><span style="color: #0000ff;">for</span>(<span style="color: #800080;">$i</span>=1;<span style="color: #800080;">$i</span>$i++<span style="color: #000000;">){        </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$arr</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$k</span> => <span style="color: #800080;">$val</span><span style="color: #000000;">) {            </span><span style="color: #800080;">$arr</span>[<span style="color: #800080;">$k</span>]=<span style="color: #800080;">$val</span>+<span style="color: #800080;">$b</span>[<span style="color: #800080;">$k</span><span style="color: #000000;">];            </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$arr</span>[<span style="color: #800080;">$k</span>]==@<span style="color: #800080;">$arr</span>[<span style="color: #800080;">$k</span>-1<span style="color: #000000;">]) {                </span><span style="color: #800080;">$b</span>[<span style="color: #800080;">$k</span>]=-<span style="color: #800080;">$b</span>[<span style="color: #800080;">$k</span><span style="color: #000000;">];                </span><span style="color: #800080;">$b</span>[<span style="color: #800080;">$k</span>-1]=-@<span style="color: #800080;">$b</span>[<span style="color: #800080;">$k</span>-1<span style="color: #000000;">];            }            </span><span style="color: #0000ff;">if</span> ((<span style="color: #800080;">$arr</span>[<span style="color: #800080;">$k</span>]>=27)||(<span style="color: #800080;">$arr</span>[<span style="color: #800080;">$k</span>])) {                <span style="color: #0000ff;">unset</span>(<span style="color: #800080;">$arr</span>[<span style="color: #800080;">$k</span><span style="color: #000000;">]);            }        }        </span><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$arr</span><span style="color: #000000;">)) {            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$i</span><span style="color: #000000;">;        }    }}</span>
これはルーチンであり、ルールに従い、段階的に進めていきますが、確かに非常に困難です。

------------------------------------- ---华丽的分隔线-------------------------------------------------------------------------------------------

 

   在我一本正经地胡说八道后,就没有更加好的想法

  那就是相遇的时候,两只蚂蚁开始掉头。如果不掉头直接走呢?和他们掉头后有什么差别?结果是没有差别!每只蚂蚁开头拿一个接力棒,碰头后,两人交换接力棒,虽然蚂蚁掉头了,但接力棒可是一直往初始方向走哦~所以解题前景变得无比明朗。知道某只蚂蚁的初始状态,就知道他开始拿的接力棒最后走了多久!至于接力棒是不是亲生的,那你管哩。反正最后一个接力棒离开杆子,最后一只蚂蚁也离开杆子。

  因而获得某种初始状态下的时间还可以这样写:

<span style="color: #0000ff;">function</span> getRes(<span style="color: #800080;">$b</span><span style="color: #000000;">){    </span><span style="color: #800080;">$arr</span>=<span style="color: #0000ff;">array</span>(3,7,11,17,23<span style="color: #000000;">);    </span><span style="color: #0000ff;">for</span>(<span style="color: #800080;">$i</span>=1;;<span style="color: #800080;">$i</span>++<span style="color: #000000;">){        </span><span style="color: #0000ff;">foreach</span> (<span style="color: #800080;">$arr</span> <span style="color: #0000ff;">as</span> <span style="color: #800080;">$k</span> => <span style="color: #800080;">$val</span><span style="color: #000000;">) {            </span><span style="color: #800080;">$arr</span>[<span style="color: #800080;">$k</span>]=<span style="color: #800080;">$val</span>+<span style="color: #800080;">$b</span>[<span style="color: #800080;">$k</span><span style="color: #000000;">];            </span><span style="color: #0000ff;">if</span> ((<span style="color: #800080;">$arr</span>[<span style="color: #800080;">$k</span>]>=27)||(<span style="color: #800080;">$arr</span>[<span style="color: #800080;">$k</span>])) {                <span style="color: #0000ff;">unset</span>(<span style="color: #800080;">$arr</span>[<span style="color: #800080;">$k</span><span style="color: #000000;">]);            }        }        </span><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">empty</span>(<span style="color: #800080;">$arr</span><span style="color: #000000;">)) {            </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$i</span><span style="color: #000000;">;        }    }}</span>

------------------------------------- ---华丽的分隔线-------------------------------------------------------------------------------------------   

  

  当然问题可以更加简化,连上面的代码都用不到了。

  通过上面分析可以看做每只蚂蚁直接走互不影响。到最后求最大值最小值的时候实际上可以先算出每只蚂蚁到两端的距离。形成五组数字。(3,24),(7,20),(11,16),(10,17),(4,23)在五组数每组数中较小值形成的5个数中最大的一个是最后结果的最小值。  五组数每组数中较大的5个数中最大的那个是结果的最大值。很容易看出来是11和24。为什么呢?典型的木桶效应啊。最后一只蚂蚁走出去了才能算完成整个事情。五只蚂蚁全部最短路径出去,得到结果才可能是最快的,五只蚂蚁全部最长路径出去,耗时才能是最慢的。

  ps:应该不会有更快的想法了吧。

   最后感谢@randeng在本问题上的指点~

 

7 階gw2010
プログラミングをせずに最初の問題を解く方法は? , 上記の 2 番目の質問に対する答えを見ました。
Re: DeanChopper
@gw2010、ごめんなさい、私も知りません。 。しかし、数学を学ぶには、もっと単純なことを考慮する必要があると感じています。
6 階軽い事故
最短: ←3 ←7 ←11 →17 →23 、最長: 3→ 7→ 11→ ←17 ←23
5th FloorDCD
実はそれほど問題ではありません、最小時間は、最も理想的な条件での時間、つまり、11cm のアリが左に歩く場合、11 秒で完了します。 , 最大時間は、実際には、2 匹のアリが出会ったときに、反対方向に進むのではなく、お互いを通過するものとして理解できます。次に、3cm のアリが右に移動します (27-3=24 秒)。
4 階Ariex
最初の 1 つは、奇数の因数を持つ数値を計算することです。
Re: MrNice
@Ariex、はい、最終的には完全二乗数のようです
Re: DeanChopper
@Ariex、これは最も直感的なアイデアであり、私もそう思います。他に良いアルゴリズムを知りません
3階randeng
2番目の質問、「プログラミングの美しさ」で入手可能。 2匹のアリが出会って向きを変えるとき、2匹のアリがすれ違い、影響し合っているように見えます。 2 匹のアリ A、B、A-gt;、Blt;- がいて、それらが出会ったとき、Alt;-、B-gt;、遭遇後の A は遭遇前の B、B は遭遇前の A とみなすことができます。 、だから彼らはまだ前に進み続けました。必要なのは、配列を 1 回走査し、移動時間を調べ、サイズを調べることだけです。
Re: DeanChopper
@randeng、ありがとうございます、必ずまたチェックします~~
2階空笑い
それぞれのアリの歩き方をシミュレーションしてみた。愚かな方法で、最速のトラックはわずか 23 で、最も遅いトラックはわずか 35 であることがわかりました。両端の間の距離は少し大きいです。計算が間違っていたでしょうか。
Re: DeanChopper
@空に向かって笑う、最短の場合、最初の 3 匹のアリは左に進み、最後の 2 つは右に進みます。 11秒かかりました。最も遅いケースでは、すべてが右に移動するため、24 秒かかります。
1 階ビジネスが上昇する
2 番目の質問は、5 匹のアリがそれぞれに影響を与えないと直接仮定しています。その他、最小時間はすべてのアリが最も近い端を歩いたとき、最大時間はすべてのアリが最も遠い端を歩いたときです。プログラムを書くことは、2 つの端から各アリの特定の距離を決定することです。最小時間は最も近いものの最大値 ((つまり 11)、最大時間は最も遠いものの最大値 (24 に等しい) になります。ループは 1 つで十分です。
Re: DeanChopper
@风生水气、実際の分析はまさにこのようなものです。主な理由は、5 つのアリがそうでないと考えるのは簡単ではないということです。このステップに影響を与える場合、上記の最初のメソッドと同様になります。
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
解决方法:您的组织要求您更改 PIN 码解决方法:您的组织要求您更改 PIN 码Oct 04, 2023 pm 05:45 PM

“你的组织要求你更改PIN消息”将显示在登录屏幕上。当在使用基于组织的帐户设置的电脑上达到PIN过期限制时,就会发生这种情况,在该电脑上,他们可以控制个人设备。但是,如果您使用个人帐户设置了Windows,则理想情况下不应显示错误消息。虽然情况并非总是如此。大多数遇到错误的用户使用个人帐户报告。为什么我的组织要求我在Windows11上更改我的PIN?可能是您的帐户与组织相关联,您的主要方法应该是验证这一点。联系域管理员会有所帮助!此外,配置错误的本地策略设置或不正确的注册表项也可能导致错误。即

Windows 11 上调整窗口边框设置的方法:更改颜色和大小Windows 11 上调整窗口边框设置的方法:更改颜色和大小Sep 22, 2023 am 11:37 AM

Windows11将清新优雅的设计带到了最前沿;现代界面允许您个性化和更改最精细的细节,例如窗口边框。在本指南中,我们将讨论分步说明,以帮助您在Windows操作系统中创建反映您的风格的环境。如何更改窗口边框设置?按+打开“设置”应用。WindowsI转到个性化,然后单击颜色设置。颜色更改窗口边框设置窗口11“宽度=”643“高度=”500“&gt;找到在标题栏和窗口边框上显示强调色选项,然后切换它旁边的开关。若要在“开始”菜单和任务栏上显示主题色,请打开“在开始”菜单和任务栏上显示主题

如何在 Windows 11 上更改标题栏颜色?如何在 Windows 11 上更改标题栏颜色?Sep 14, 2023 pm 03:33 PM

默认情况下,Windows11上的标题栏颜色取决于您选择的深色/浅色主题。但是,您可以将其更改为所需的任何颜色。在本指南中,我们将讨论三种方法的分步说明,以更改它并个性化您的桌面体验,使其具有视觉吸引力。是否可以更改活动和非活动窗口的标题栏颜色?是的,您可以使用“设置”应用更改活动窗口的标题栏颜色,也可以使用注册表编辑器更改非活动窗口的标题栏颜色。若要了解这些步骤,请转到下一部分。如何在Windows11中更改标题栏的颜色?1.使用“设置”应用按+打开设置窗口。WindowsI前往“个性化”,然

OOBELANGUAGE错误Windows 11 / 10修复中出现问题的问题OOBELANGUAGE错误Windows 11 / 10修复中出现问题的问题Jul 16, 2023 pm 03:29 PM

您是否在Windows安装程序页面上看到“出现问题”以及“OOBELANGUAGE”语句?Windows的安装有时会因此类错误而停止。OOBE表示开箱即用的体验。正如错误提示所表示的那样,这是与OOBE语言选择相关的问题。没有什么可担心的,你可以通过OOBE屏幕本身的漂亮注册表编辑来解决这个问题。快速修复–1.单击OOBE应用底部的“重试”按钮。这将继续进行该过程,而不会再打嗝。2.使用电源按钮强制关闭系统。系统重新启动后,OOBE应继续。3.断开系统与互联网的连接。在脱机模式下完成OOBE的所

Windows 11 上启用或禁用任务栏缩略图预览的方法Windows 11 上启用或禁用任务栏缩略图预览的方法Sep 15, 2023 pm 03:57 PM

任务栏缩略图可能很有趣,但它们也可能分散注意力或烦人。考虑到您将鼠标悬停在该区域的频率,您可能无意中关闭了重要窗口几次。另一个缺点是它使用更多的系统资源,因此,如果您一直在寻找一种提高资源效率的方法,我们将向您展示如何禁用它。不过,如果您的硬件规格可以处理它并且您喜欢预览版,则可以启用它。如何在Windows11中启用任务栏缩略图预览?1.使用“设置”应用点击键并单击设置。Windows单击系统,然后选择关于。点击高级系统设置。导航到“高级”选项卡,然后选择“性能”下的“设置”。在“视觉效果”选

Windows 11 上的显示缩放比例调整指南Windows 11 上的显示缩放比例调整指南Sep 19, 2023 pm 06:45 PM

在Windows11上的显示缩放方面,我们都有不同的偏好。有些人喜欢大图标,有些人喜欢小图标。但是,我们都同意拥有正确的缩放比例很重要。字体缩放不良或图像过度缩放可能是工作时真正的生产力杀手,因此您需要知道如何对其进行自定义以充分利用系统功能。自定义缩放的优点:对于难以阅读屏幕上的文本的人来说,这是一个有用的功能。它可以帮助您一次在屏幕上查看更多内容。您可以创建仅适用于某些监视器和应用程序的自定义扩展配置文件。可以帮助提高低端硬件的性能。它使您可以更好地控制屏幕上的内容。如何在Windows11

10种在 Windows 11 上调整亮度的方法10种在 Windows 11 上调整亮度的方法Dec 18, 2023 pm 02:21 PM

屏幕亮度是使用现代计算设备不可或缺的一部分,尤其是当您长时间注视屏幕时。它可以帮助您减轻眼睛疲劳,提高易读性,并轻松有效地查看内容。但是,根据您的设置,有时很难管理亮度,尤其是在具有新UI更改的Windows11上。如果您在调整亮度时遇到问题,以下是在Windows11上管理亮度的所有方法。如何在Windows11上更改亮度[10种方式解释]单显示器用户可以使用以下方法在Windows11上调整亮度。这包括使用单个显示器的台式机系统以及笔记本电脑。让我们开始吧。方法1:使用操作中心操作中心是访问

如何修复Windows服务器中的激活错误代码0xc004f069如何修复Windows服务器中的激活错误代码0xc004f069Jul 22, 2023 am 09:49 AM

Windows上的激活过程有时会突然转向显示包含此错误代码0xc004f069的错误消息。虽然激活过程已经联机,但一些运行WindowsServer的旧系统可能会遇到此问题。通过这些初步检查,如果这些检查不能帮助您激活系统,请跳转到主要解决方案以解决问题。解决方法–关闭错误消息和激活窗口。然后,重新启动计算机。再次从头开始重试Windows激活过程。修复1–从终端激活从cmd终端激活WindowsServerEdition系统。阶段–1检查Windows服务器版本您必须检查您使用的是哪种类型的W

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。