Conversation
| Setの解法についてはあまり変更する余地が思いつかなかったので、フロイドの循環検出法で実装 | ||
| ## 解答 | ||
| - ループ検知部分を関数化してみる。 | ||
| - collisionがパッと思い浮かんだのですがcollisionは違和感あるでしょうか? |
There was a problem hiding this comment.
(GPTに聞いた意見ですが)collisionは例外やバグっぽい響きがあるということでGPTにはmeetingを勧められました
There was a problem hiding this comment.
やはりcollisionはそういうニュアンスを感じますよね。
「出会う」や「追いつく」みたいなニュアンスの語をあてた方が親切でした。ありがとうございます!
| ```java | ||
| public class Solution { | ||
| public ListNode detectCycle(ListNode head) { | ||
| if (head == null) { |
There was a problem hiding this comment.
一応こちらの条件分岐は無くてもいけますね。nullの場合は確かに例外的な感じがするのであってもよいとも思います。
| ListNode fromStart = head; | ||
| ListNode fromCollision = collisionNode; | ||
|
|
||
| while (fromStart == fromCollision) { |
There was a problem hiding this comment.
javaに詳しくないので違うかもしれませんが、等しくない限り続けるので!=ではないでしょうか?
There was a problem hiding this comment.
おっしゃる通り、!=が正しいです。
お恥ずかしいです。
ありがとうございます!
There was a problem hiding this comment.
これは、step2通ったんでしょうか?
通してみることをおすすめします。通るのであれば原因が気になりますし。通してないのであれば、それはそれで手に馴染んでないので気になります。
There was a problem hiding this comment.
あー理解しました。Step3で通す前に修正して、passは考えてない感じなんですね。すいません
There was a problem hiding this comment.
ご指摘のとおり、正しく動作しません。
コード整理するときにミスってました。
きちんと確認する癖つけたいと思います。
|
|
||
| ## 解答2 | ||
| - [Rでフロイドの循環検出法を可視化する](https://qiita.com/nozma/items/bfa3e089cd432b74c10d) で始点検出方法を理解し、実装してみる | ||
| - 運用するプログラムの場合、フロイドの循環検出法の概要からコメントを書くが、この場合どこまで書くか |
There was a problem hiding this comment.
コメントを書くとしたらフロイドの循環検出法を使っていることも書いておくと親切かなと思います。
There was a problem hiding this comment.
たしかにそれくらいは書いておくべきでした。
名前さえ分かればググれますからね。
|
stepを重ねるごとにコードが読みやすくなっており、素晴らしいなと思いました! |
|
Set解法優先、命名も良い感じで文句ないです。全体的に読みやすいです👍 |
| return null; | ||
| } | ||
|
|
||
| HashSet<ListNode> visitedNodes = new HashSet<>(); |
There was a problem hiding this comment.
自分なら、HashSet の実装に依存しないコードであれば、
Set<ListNode> visitedNodes = new HashSet<>();のように、インターフェースで受け取るのですが、好みの問題かもしれません。
There was a problem hiding this comment.
確かにHashSet固有のメソッドを使用していないので、HashSetで宣言する意味はあまり無いですね。
一旦、nodchipさんの好みを真似してインターフェース優先で宣言するようにしてみます。
|
|
||
|
|
||
| # step2 他の方の解答を見る | ||
| Setの解法についてはあまり変更する余地が思いつかなかったので、フロイドの循環検出法で実装 |
There was a problem hiding this comment.
| ``` | ||
|
|
||
|
|
||
| # step2 他の方の解答を見る |
There was a problem hiding this comment.
どの方の解答を参考したのかがわかるようにPRのリンクを貼っておくと、参考にした実装からどのあたりを変えた・変えなかったのかがわかってより思考プロセスが浮き彫りになり、議論が盛り上がるかなと思いますので、貼ることをお勧めします。
There was a problem hiding this comment.
ありがとうございます!
次のPRあたりから参照したPRを明示し始めました。
| ``` | ||
|
|
||
| # step3 3回ミスなく書く | ||
| Set解法で。 |
There was a problem hiding this comment.
ちなみに Set 解法で step 3に臨もうと思った理由はなんでしょうか?
step 2で hare and tortoise の解法を学んでいらっしゃったのであえてまた Set に戻して解いた理由が気になります。
There was a problem hiding this comment.
Setを用いた実装のほうがシンプルで分かりやすいからです。
hare and tortoiseの方が高速なのは確かですが、そこの高速化が必要になる場面は少ないかなと思いまして。
それであれば誰が見ても一目で分かるSetを使った解法を優先すべきかなと判断しました。
今回解いた問題:
142. Linked List Cycle II
次に解く問題:
83. Remove Duplicates from Sorted List
言語: Java