<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Leetcode 區 on Collie 的部落格</title><link>https://blog.collie.tw/series/leetcode/</link><description>Recent content in Leetcode 區 on Collie 的部落格</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>© 2026</copyright><lastBuildDate>Tue, 22 Nov 2022 16:42:51 +0800</lastBuildDate><atom:link href="https://blog.collie.tw/series/leetcode/index.xml" rel="self" type="application/rss+xml"/><item><title>224. Basic Calculator</title><link>https://blog.collie.tw/posts/leetcode/224/</link><pubDate>Tue, 22 Nov 2022 16:42:51 +0800</pubDate><guid>https://blog.collie.tw/posts/leetcode/224/</guid><description>&lt;h2 class="relative group"&gt;&lt;a href="https://leetcode.com/problems/basic-calculator/" target="_blank" rel="noreferrer"&gt;原始題目&lt;/a&gt;&#10; &lt;div id="原始題目" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%8e%9f%e5%a7%8b%e9%a1%8c%e7%9b%ae" aria-label="定位點"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;給定字串包含 &lt;code&gt;{ '+', '-', ' ', '(', ')'}&lt;/code&gt; 以及數字，求出算式答案。&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;值得紀錄之處&#10; &lt;div id="值得紀錄之處" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%80%bc%e5%be%97%e7%b4%80%e9%8c%84%e4%b9%8b%e8%99%95" aria-label="定位點"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&#10;&lt;h3 class="relative group"&gt;處理太多條件分支&#10; &lt;div id="處理太多條件分支" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e8%99%95%e7%90%86%e5%a4%aa%e5%a4%9a%e6%a2%9d%e4%bb%b6%e5%88%86%e6%94%af" aria-label="定位點"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h3&gt;&#10;&lt;p&gt;我覺得這題最麻煩的坑在於符號太多種了。如果用 &lt;code&gt;if&lt;/code&gt; 來寫的話，會有太多條件分支（ branch condition ），所以我一直很想把某些 branch 合在一起。比如說：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt; 後面跟著 &lt;code&gt;(&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt; 後面跟著數字&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt; 後面是 &lt;code&gt; &lt;/code&gt;, 而再之後還可以混合前兩項組合出更多種變化。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;這樣乘起來情況非常多，也很難維護。如果可以忽略掉 &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt;, 只在遇到數字和 &lt;code&gt;(&lt;/code&gt; 的時候，再往回檢查符號，就可以減少需要列舉的情況數量了。&lt;/p&gt;</description></item><item><title>2095. Delete the Middle Node of a Linked List</title><link>https://blog.collie.tw/posts/leetcode/2095/</link><pubDate>Sat, 22 Oct 2022 00:23:42 +0800</pubDate><guid>https://blog.collie.tw/posts/leetcode/2095/</guid><description>&lt;p&gt;拜讀了&lt;a href="https://hackmd.io/@sysprog/c-linked-list#%E5%BE%9E-Linux-%E6%A0%B8%E5%BF%83%E7%9A%84%E8%97%9D%E8%A1%93%E8%AB%87%E8%B5%B7" target="_blank" rel="noreferrer"&gt;你所不知道的 C 語言： linked list 和非連續記憶體&lt;/a&gt;一文中所提到的 &amp;ldquo;&lt;strong&gt;good taste&lt;/strong&gt;&amp;rdquo; 段落 , 覺得非常有趣而躍躍欲試，所以找這題來練練手。（後來發現底下的例子也有寫到這題😅，而且效率又比我想到的解更好，甚至還有一些記憶體管理的細節，學到了！）&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;&lt;a href="https://leetcode.com/problems/delete-the-middle-node-of-a-linked-list/" target="_blank" rel="noreferrer"&gt;原始題目&lt;/a&gt;&#10; &lt;div id="原始題目" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%8e%9f%e5%a7%8b%e9%a1%8c%e7%9b%ae" aria-label="定位點"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;&#10;&#10;這題是給定一個不固定長度 \(n\) 的鏈結串列，然後要求刪除最中間的那個節點（ node ） （精確來說是第 \(\lfloor \frac{n}{2} \rfloor\) 個節點）&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;值得紀錄之處&#10; &lt;div id="值得紀錄之處" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%80%bc%e5%be%97%e7%b4%80%e9%8c%84%e4%b9%8b%e8%99%95" aria-label="定位點"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;這裡所謂的 good taste 是指利用一些技巧，去減少「特例」發生的情形，進而使程式碼更加乾脆俐落。舉例來說，原本在這題常見的解法有兩種：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;先用迴圈把整個鏈結串列遍歷，計算有幾個節點。算完再跑一次 &lt;code&gt;for&lt;/code&gt; 迴圈把最中間的節點刪除。&lt;/li&gt;&#10;&lt;li&gt;利用 &lt;code&gt;fast&lt;/code&gt; 和 &lt;code&gt;slow&lt;/code&gt; 兩指標，丟進迴圈裡面， &lt;code&gt;fast&lt;/code&gt; 每回合前進兩格， &lt;code&gt;slow&lt;/code&gt; 每回合前進一格，這樣只要一次迴圈就可以抓到要刪除的節點並且刪除。&lt;br&gt;&#10;&#10; &#10;&#10;&#10;&#10;&lt;div&#10; &#10; class="flex px-4 py-3 rounded-md shadow bg-primary-100 dark:bg-primary-900"&#10; &#10; &gt;&#10; &lt;span&#10; &#10; class="text-primary-400 pe-3 flex items-center"&#10; &#10; &gt;&#10; &lt;span class="relative block icon"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"&gt;&lt;path fill="currentColor" d="M506.3 417l-213.3-364c-16.33-28-57.54-28-73.98 0l-213.2 364C-10.59 444.9 9.849 480 42.74 480h426.6C502.1 480 522.6 445 506.3 417zM232 168c0-13.25 10.75-24 24-24S280 154.8 280 168v128c0 13.25-10.75 24-23.1 24S232 309.3 232 296V168zM256 416c-17.36 0-31.44-14.08-31.44-31.44c0-17.36 14.07-31.44 31.44-31.44s31.44 14.08 31.44 31.44C287.4 401.9 273.4 416 256 416z"/&gt;&lt;/svg&gt;&#10;&lt;/span&gt;&#10; &lt;/span&gt;&#10;&#10; &lt;span&#10; &#10; class="dark:text-neutral-300"&#10; &#10; &gt;兩者的時間複雜度都是 \( \log (n)\), 但是後者的程式碼量會因為少一個迴圈而比較少，因此我以後者為比較標準。&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&#10;&lt;h3 class="relative group"&gt;非 indirect pointer 的解&#10; &lt;div id="非-indirect-pointer-的解" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e9%9d%9e-indirect-pointer-%e7%9a%84%e8%a7%a3" aria-label="定位點"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;此程式碼取自 leetcode 論壇的某位大大寫的&lt;a href="https://leetcode.com/problems/delete-the-middle-node-of-a-linked-list/solutions/2698219/delete-the-middle-node-of-a-linked-list/" target="_blank" rel="noreferrer"&gt;詳解文章&lt;/a&gt;微調而得&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Solution&lt;/span&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;ListNode&lt;span style="color:#f92672"&gt;*&lt;/span&gt; deleteMiddle(ListNode&lt;span style="color:#f92672"&gt;*&lt;/span&gt; head) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&#9;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (head &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; next &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;nullptr&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&#9;&#9;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;nullptr&lt;/span&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&#9;ListNode &lt;span style="color:#f92672"&gt;*&lt;/span&gt;slow &lt;span style="color:#f92672"&gt;=&lt;/span&gt; head, &lt;span style="color:#f92672"&gt;*&lt;/span&gt;fast &lt;span style="color:#f92672"&gt;=&lt;/span&gt; head &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; next &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; next;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&#9;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; (fast &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;nullptr&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; fast &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; next &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;nullptr&lt;/span&gt;) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&#9;&#9;slow &lt;span style="color:#f92672"&gt;=&lt;/span&gt; slow &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; next;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&#9;&#9;fast &lt;span style="color:#f92672"&gt;=&lt;/span&gt; fast &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; next &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; next;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&#9;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&#9;slow &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; next &lt;span style="color:#f92672"&gt;=&lt;/span&gt; slow &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; next &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; next;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;&#9;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; head;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#9;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;p&gt;可以注意到，上面的解法 (line 4) 會有一個特例 (edge case), 如果開頭是 &lt;code&gt;nullptr&lt;/code&gt;, 那就如何如何&amp;hellip;&amp;hellip;。有時候特例一多，可能會寫了整面的 &lt;code&gt;if-else&lt;/code&gt;, 看了就痛苦😵‍💫。如果有個魔法可以使這個特例更減少，那程式碼就可以更精簡，這也是我這次的練習目標。&lt;/p&gt;</description></item></channel></rss>