Conversation
| ### 解法1. フロイドの循環検出法 | ||
| * 1つ飛ばしで進むウサギ(fast)と1つずつ進む亀(slow)の2つのポインタを同時に同じリスト上を走らせると、サイクルがある場合必ずどこかのノードで合流するという考え方 | ||
| * https://en.wikipedia.org/wiki/Cycle_detection#Floyd's_tortoise_and_hare | ||
| * 感想: 2つ走らせるという発想はなかった。時間をかけても自分でゼロから思いつくのは厳しいと思う。考え方のパターンとしてストックしたい |
There was a problem hiding this comment.
このあたりは、科学手品みたいなものなので、あまり気にしなくてよいかと思います。
https://docs.google.com/document/d/11HV35ADPo9QxJOpJQ24FcZvtvioli770WWdZZDaLOfg/edit?tab=t.0#heading=h.2k4z0wt6ytf9
There was a problem hiding this comment.
なるほど、すべてを真面目に捉えてすぎていたので、もう少し気楽に考えてみます。ありがとうございます。
| ```java | ||
| public class Solution { | ||
| public boolean hasCycle(ListNode head) { | ||
| ListNode current = head; |
There was a problem hiding this comment.
currentという変数名の是非はdiscordで時々話題に上がっているので見てみてください
There was a problem hiding this comment.
調べたら大量に出てきました。。勉強になりました。
今回はnodeに変更しようと思います。
https://github.com/atomina1/Arai60_review/pull/2#discussion_r1890232755
current という単語は、 previous や next と対比するのであれば意味があると思いますが、単独で使ってもあまり情報がないように思います。 node はいかがでしょうか?
https://discord.com/channels/1084280443945353267/1231966485610758196/1236231890038689844
これくらいの長さだったら、まあいいとは思うんですが、本当は current という名前は、あんまり情報量がないので、もう少し情報の載ったもののほうがいいかもしれません。
(current: 現在注目しているもの、くらいのつもりですよね。)
なんか全体的に命名が分かりづらいなと思いました。
current_headのcurrentには現在注目しているくらいの意味しかなくて、reversed_headとどう違うんだろうみたいな感想を持ちました。あとは、reversed_headとありますが、current_headもreverseしてるじゃんみたいな気持ちになりました。
| public class Solution { | ||
| public boolean hasCycle(ListNode head) { | ||
| ListNode current = head; | ||
| HashSet<ListNode> visitedSet = new HashSet<>(); |
There was a problem hiding this comment.
javaがどうかはわかりませんが、pythonでは変数名に型名を入れるのを避けるべきだみたいな話があります。
javaに関しても、型名が変数名に入っていても読みやすさは変わらないように思います。
There was a problem hiding this comment.
Javaでも一般的に型名を入れない方がいいみたいですね。修正します。ありがとうございます。
| ```java | ||
| public class Solution { | ||
| public boolean hasCycle(ListNode head) { | ||
| ListNode node = head; | ||
| HashSet<ListNode> visitedNodes = new HashSet<>(); |
There was a problem hiding this comment.
レビュー遅くなりすみません。
全体的に良いと思います!ただすでに指摘されているように変数名が気になりました。visitedNodesのように変数名に大文字を含むのはpepでは推奨されていないようです。
そのためvisited_nodesなどのようにするほうがいいと思いますが、そもそもnodeが入っていないときもあるので、僕だったらvisitedくらいにします。
関数や変数の名前
関数の名前は小文字のみにすべきです。また、読みやすくするために、必要に応じて単語をアンダースコアで区切るべきです。
変数の名前についても、関数と同じ規約に従います。
mixedCase が既に使われている (例: threading.py) 場合にのみ、互換性を保つために mixedCase を許可します。
There was a problem hiding this comment.
おそらく別のドキュメントですが、仰る通り同じく、PEP8 という規約では変数名と関数名は lower_case_with_underscores を使いましょうとなっているようです。
https://peps.python.org/pep-0008/#descriptive-naming-styles
There was a problem hiding this comment.
@lilnoahhh @olsen-blue
レビューありがとうございます。たしかにvisitedの方が良さそうですね。
変数名の命名規則に関してですが、PEP8はPython向けの規約のため一概にJavaのコードに適用すべきではないと考えています。以下はGoogleのコーディング規約ですが、JavaではlowerCamelCaseが推奨されているようです。
Local variable names are written in lowerCamelCase
https://google.github.io/styleguide/javaguide.html#s5.2.7-local-variable-names
| * 1つ飛ばしで進むウサギ(fast)と1つずつ進む亀(slow)の2つのポインタを同時に同じリスト上を走らせると、サイクルがある場合必ずどこかのノードで合流するという考え方 | ||
| * https://en.wikipedia.org/wiki/Cycle_detection#Floyd's_tortoise_and_hare | ||
| * 感想: 2つ走らせるという発想はなかった。時間をかけても自分でゼロから思いつくのは厳しいと思う。考え方のパターンとしてストックしたい | ||
| * [追記]レビュアーからのコメントとして、この解法は科学手品のようなものなので自分で思いつけなくてもあまり気にしなくてよいとのこと。一方でStep1のSetを使った解法は思いつけて普通とのこと |
There was a problem hiding this comment.
全体的に良いと思います。Discord内に直感的な解説も転がってるので、まだ見てなければどうぞ。
https://discord.com/channels/1084280443945353267/1246383603122966570/1252209488815984710
There was a problem hiding this comment.
非常に分かりやすいですね。とても参考になりました。
ありがとうございます。
問題
141. Linked List Cycle
言語
Java
次の問題
https://leetcode.com/problems/linked-list-cycle-ii