Conversation
[2. Add Two Numbers](https://leetcode.com/problems/add-two-numbers/)
| if (carry) { | ||
| sum++; | ||
| carry = false; | ||
| } | ||
| if (sum>=10) { | ||
| sum -= 10; | ||
| carry = true; | ||
| } |
There was a problem hiding this comment.
carryをintで持つようにするとこの辺りの分岐は全部消せそうです。carryの更新は carry = sum / 10; で出来ます。
あと0と1以外も扱えるようになるため、応用範囲も広がると思います。(この問題では0か1しか出ませんが)
There was a problem hiding this comment.
コメントありがとうございます。
carryフラグに引っ張られすぎていました、intで保持して更新が楽になる方が良さそうですね
| class Solution { | ||
| public: | ||
| ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { | ||
| ListNode sentinel_node = ListNode(); |
There was a problem hiding this comment.
コメントありがとうございます、これはたしかにそのとおりですね。
| public: | ||
| ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { | ||
| ListNode sentinel_node = ListNode(); | ||
| ListNode* sum_node = &sentinel_node; |
| ListNode* left = l1; | ||
| ListNode* right = l2; |
There was a problem hiding this comment.
コメントありがとうございます。
引数として渡されてきているl1,l2を書き換えたくなかったので詰め替えていました。
変数名を改善すると多少マシになりそうですかね
There was a problem hiding this comment.
書き換えたところで呼び出し元に影響があるわけではないのでただイテレートするだけなら書き換えちゃって問題ないかなと思います。
There was a problem hiding this comment.
Discord内の引数に関する議論を一通り眺めましたが、この場合はl1,l2をそのまま使っても自然な気がしますね
ちょっとその方針でも一度書いてみます。
| ListNode* left = l1; | ||
| ListNode* right = l2; | ||
| bool carry =false; | ||
| while (left || right) { |
There was a problem hiding this comment.
ありがとうございます。
なるほど、確かにその方が余計な処理をwhileループの外に書かずにすみますね。
| ListNode* sum_node = &sentinel_node; | ||
| ListNode* left = l1; | ||
| ListNode* right = l2; | ||
| bool carry =false; |
There was a problem hiding this comment.
細かいですが = の左右は1つスペースを挟むのが通常だと思います
| sum++; | ||
| carry = false; | ||
| } | ||
| if (sum>=10) { |
There was a problem hiding this comment.
https://github.com/colorbox/leetcode/pull/21/files#r1679006461
同上です
なにかフォーマッタできれいにしてからpushしたほうが良さそうです
There was a problem hiding this comment.
あとスタイルガイドに目を通したり、同じ言語で実装された著名なライブラリを眺めてみるといいかもと思いました。演算子の両端に半角をスペースを入れる、といったことは慣習として大体どの言語の実装でもやることなので、時間を取ってコードを読む時間を設ければ、自然と違和感を感じれるようになってくると思います。
There was a problem hiding this comment.
この問題を解いた別の方のプルリクエストなんかも、気軽に読める良い題材だと思います。
There was a problem hiding this comment.
コメントありがとうございます。
これはtypoというかコードセルフチェックがちゃんとできていないですね。
読み直す時間取るのとフォーマッタ導入をします。
| public: | ||
| ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { | ||
| ListNode sentinel_node; | ||
| ListNode* adding_node = &sentinel_node; |
There was a problem hiding this comment.
もう少し良い命名がある気もします。ものとしては1つ前の桁について持っているので、自分ならprevとかにするかなと思います。
There was a problem hiding this comment.
なるほどありがとうございます。
加算を行うノードとして捉えてましたが、prevとしても通じますね
| digit += l2->val; | ||
| l2 = l2->next; | ||
| } | ||
| if (carry) { |
There was a problem hiding this comment.
carryを0, 1で持っているのでif文なしでdigit += carryと書けます
There was a problem hiding this comment.
ありがとうございます。
確かに分岐なくすことでシンプルにできますね
| if (digit >= 10) { | ||
| digit = digit - 10; | ||
| } | ||
| adding_node->next = new ListNode(digit); |
There was a problem hiding this comment.
なるほど、ありがとうございます。
%にすれば桁上りしててもしてなくても関係なく扱えますね
2. Add Two Numbers