<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Stack on 跟著 Desolve 學程式</title><link>https://desolve.pages.dev/tags/stack/</link><description>Recent content in Stack on 跟著 Desolve 學程式</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Sat, 27 Feb 2021 00:00:00 +0800</lastBuildDate><atom:link href="https://desolve.pages.dev/tags/stack/index.xml" rel="self" type="application/rss+xml"/><item><title>從LeetCode學演算法 - 114 Stack (3)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-114-stack-3/</link><pubDate>Sat, 27 Feb 2021 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-114-stack-3/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 114 Stack (3)" /&gt;&lt;p&gt;&lt;strong&gt;0946. Validate Stack Sequences (Medium)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="寫在前面"&gt;寫在前面
&lt;/h2&gt;&lt;p&gt;目前&lt;strong&gt;0元挑戰賽&lt;/strong&gt; 的活動已經開始囉！&lt;br&gt;
只要&lt;strong&gt;修課後三個月內完課且成功錄取新工作並撰寫心得，&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;課程就會全額退費喲！請使用下面連結看更詳細的規則說明：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(目前只剩一般的套組優惠~）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;零元求職挑戰賽 Python 組｜從 LeetCode 學演算法 + 面試成功指南&lt;/strong&gt; &lt;a class="link" href="https://bit.ly/zeroclg?fbclid=IwAR0cGOc6L5R4j26i6BqncG0m1tPPPx5-Z1M0vAOzJpnwUrByX3q-gWE1Sfw" target="_blank" rel="noopener"
&gt;http://bit.ly/zeroclg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;抽獎活動還在繼續累積人數(現在好像沒有人想抽XD)&lt;br&gt;
在&lt;a class="link" href="https://www.facebook.com/groups/pythontw/permalink/10160354153893438/" target="_blank" rel="noopener"
&gt;&lt;strong&gt;Python Taiwan的連結第100篇的文章&lt;/strong&gt; &lt;/a&gt;底下，&lt;br&gt;
&lt;strong&gt;公開分享到你的臉書、按讚該篇文章、並留言告訴我說，&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;「你最喜歡這一整個系列的哪一篇？為什麼？」或&lt;br&gt;
「除了從LeetCode學演算法系列以外，&lt;br&gt;
你還想要看到關於什麼方向的文章？」&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;超過20則留言的話&lt;/strong&gt; (有完成以上步驟的才算)，我們就抽一組&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜進階篇」+「從Leetcode學演算法｜面試篇」&lt;br&gt;
課程的免費兌換券進行贈送！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;期限嘛…就延長到滿人數吧XDD (不然也沒辦法哈哈)&lt;/p&gt;
&lt;p&gt;容筆者工商一下，&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜進階篇」&lt;/strong&gt; 開放預購啦！&lt;br&gt;
這次選了40道難度加深的LeetCode題目，&lt;br&gt;
同樣也會細部解說對應的技巧及須要掌握的演算法！&lt;br&gt;
同時這次購買進階篇的話，&lt;br&gt;
額外還加贈**「從Leetcode學演算法｜面試篇」** ！&lt;br&gt;
當中包含了&lt;strong&gt;面試準備須知分享&lt;/strong&gt; ，&lt;strong&gt;及訪談國內外不同經驗的工程師&lt;/strong&gt; ，&lt;br&gt;
讓你不論是&lt;strong&gt;想走前端/後端/一般軟工&lt;/strong&gt; 或者是&lt;strong&gt;想找國外的工作&lt;/strong&gt; ，&lt;br&gt;
是&lt;strong&gt;初學想轉職&lt;/strong&gt; 還是&lt;strong&gt;正在工作&lt;/strong&gt; ，都能夠從中得到收穫呦！&lt;br&gt;
有興趣的朋友可以使用下面的早鳥優惠～&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜進階篇」+「從Leetcode學演算法｜面試篇」&lt;/strong&gt; ：&lt;br&gt;
&lt;a class="link" href="https://bit.ly/leetcodeadv" target="_blank" rel="noopener"
&gt;https://bit.ly/leetcodeadv&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given two sequences &lt;code&gt;pushed&lt;/code&gt; and &lt;code&gt;popped&lt;/code&gt; &lt;strong&gt;with distinct values&lt;/strong&gt; , return &lt;code&gt;true&lt;/code&gt; if and only if this could have been the result of a sequence of push and pop operations on an initially empty stack.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: We might do the following sequence:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;push(1), push(2), push(3), push(4), pop() -&amp;gt; 4,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;push(5), pop() -&amp;gt; 5, pop() -&amp;gt; 3, pop() -&amp;gt; 2, pop() -&amp;gt; 1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: 1 cannot be popped before 2.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="constraints"&gt;Constraints
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0 &amp;lt;= pushed.length == popped.length &amp;lt;= 1000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;0 &amp;lt;= pushed[i], popped[i] &amp;lt; 1000&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pushed&lt;/code&gt; is a permutation of &lt;code&gt;popped&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pushed&lt;/code&gt; and &lt;code&gt;popped&lt;/code&gt; have distinct values.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定兩個序列pushed跟poped，&lt;br&gt;
序列當中的每個值都是獨特的(也就是每個值會不同)，&lt;br&gt;
如果對於一個空的stack進行push和pop的操作，&lt;br&gt;
能夠完全符合pushed和poped列出來的順序的話，&lt;br&gt;
就回傳true，否則回傳false。&lt;/p&gt;
&lt;p&gt;這個問題乍看之下或許有點不夠清楚，&lt;br&gt;
簡單來說呢，就是不管如何，推入的順序一定是pushed，&lt;br&gt;
也就是放入的時候的順序是固定的，只是選擇在什麼時候poped而已，&lt;br&gt;
例如[1, 2, 3, 4, 5]，&lt;br&gt;
如果我們&lt;strong&gt;push兩次，pop一次，再push三次，pop四次&lt;/strong&gt; ，&lt;br&gt;
那麼我們所得到的結果會是:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;stack poped
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1, 2 　
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1, 3, 4, 5 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 2, 5, 4, 3, 1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再多做一些嘗試，就會知道pop的時間點會影響到poped最終的順序結果。&lt;br&gt;
因此，我們可以試想一下幾個情況：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;當stack裡面沒有東西 -&amp;gt; &lt;br&gt;
沒辦法pop東西出來，必須要先push進去才行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;當stack裡面有東西 -&amp;gt; &lt;br&gt;
要pop出來嗎？由於每個值都相異，所以這邊出現過的數字，後面就不能出現了！因此我們應該&lt;strong&gt;看現在poped的順序走到哪裡&lt;/strong&gt; ，去檢查現在&lt;strong&gt;stack最上面&lt;/strong&gt; 是否和&lt;strong&gt;poped對應的數字一樣&lt;/strong&gt; ，這樣才代表需要做pop的操作。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;依照上面的想法，我們做的順序應該像這樣：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;開一個新的Stack，這邊稱為st。&lt;/li&gt;
&lt;li&gt;宣告一個變數i並初始化為0，用來&lt;strong&gt;記錄下一個poped所在的index&lt;/strong&gt; 。&lt;/li&gt;
&lt;li&gt;使用迴圈，依序每次從pushed取出一個num：&lt;br&gt;
3–1. 將num推入st中&lt;br&gt;
3–2. 當st還有值在內，且&lt;strong&gt;最上層剛好和poped[i]相同&lt;/strong&gt; 時，進行迴圈，&lt;br&gt;
對st進行一次pop，並&lt;strong&gt;遞增i&lt;/strong&gt; (代表往下一個值來看)&lt;br&gt;
(不相同的話，就代表這個值不該在這邊被pop出來)&lt;/li&gt;
&lt;li&gt;大迴圈結束後，若st剛好清空，代表這個順序是OK的，&lt;br&gt;
&lt;strong&gt;因此st是空的時候回傳true，否則回傳false&lt;/strong&gt; 。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;依此，寫成程式碼如下：&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;p&gt;Java的部分，檢查stack是否為空要用isEmpty函式，&lt;br&gt;
看stack最上層可以使用&lt;strong&gt;peek&lt;/strong&gt; ，也就是先偷看一下，&lt;br&gt;
避免使用pop，因為我們還沒有篤定要將其移出stack外。&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/1d92e39fa0831372ed7a9fba27a039a4.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;p&gt;Python的部分，我們可以&lt;strong&gt;直接使用list做為stack來使用&lt;/strong&gt; ，&lt;br&gt;
可以使用append/pop，看最上層就直接利用&lt;strong&gt;st[-1]&lt;/strong&gt; 即可。&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/24781ffdec4796128144201b8c38ef37.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N)/O(N)，N為pushed/popped的長度)&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;
&lt;p&gt;想看看其他題目嗎？&lt;br&gt;
歡迎從&lt;a class="link" href="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-0/" &gt;&lt;strong&gt;第零篇&lt;/strong&gt; &lt;/a&gt;找你想要的！&lt;/p&gt;
&lt;p&gt;同時追蹤粉專以獲得更多新文章的通知：&lt;br&gt;
&lt;a class="link" href="https://www.facebook.com/learnwithdesolve" target="_blank" rel="noopener"
&gt;&lt;strong&gt;跟著Desolve學程式&lt;/strong&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;另外，&lt;strong&gt;「從Leetcode學演算法｜基礎篇」&lt;/strong&gt; 已經回原價囉，&lt;br&gt;
先前的優惠碼會失效，但這邊仍然為讀者保留了300塊的折抵，&lt;br&gt;
雖然&lt;strong&gt;整捆一起買總體比較划算&lt;/strong&gt; (差290而已就有整組了阿XD)，&lt;br&gt;
如果你還是想先試試基礎課的話，&lt;br&gt;
&lt;strong&gt;300元折抵的連結&lt;/strong&gt; 在這邊：&lt;br&gt;
&lt;a class="link" href="https://bit.ly/1desolve" target="_blank" rel="noopener"
&gt;https://bit.ly/1desolve&lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 107 String (7) / Stack (2)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-107-string-7-stack-2/</link><pubDate>Sat, 12 Dec 2020 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-107-string-7-stack-2/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 107 String (7) / Stack (2)" /&gt;&lt;p&gt;&lt;strong&gt;1544. Make The String Great (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;好久不見啦！最近筆者比較忙碌，還請多多見諒XD&lt;/p&gt;
&lt;h2 id="寫在前面"&gt;寫在前面
&lt;/h2&gt;&lt;p&gt;抽獎活動還在繼續累積人數(現在好像沒有人想抽XD)&lt;br&gt;
在&lt;a class="link" href="https://www.facebook.com/groups/pythontw/permalink/10160354153893438/" target="_blank" rel="noopener"
&gt;&lt;strong&gt;Python Taiwan的連結第100篇的文章&lt;/strong&gt; &lt;/a&gt;底下，&lt;br&gt;
&lt;strong&gt;公開分享到你的臉書、按讚該篇文章、並留言告訴我說，&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;「你最喜歡這一整個系列的哪一篇？為什麼？」或&lt;br&gt;
「除了從LeetCode學演算法系列以外，&lt;br&gt;
你還想要看到關於什麼方向的文章？」&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;超過20則留言的話&lt;/strong&gt; (有完成以上步驟的才算)，我們就抽一組&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜進階篇」+「從Leetcode學演算法｜面試篇」&lt;br&gt;
課程的免費兌換券進行贈送！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;期限嘛…就延長到滿人數吧XDD (不然也沒辦法哈哈)&lt;/p&gt;
&lt;p&gt;容筆者工商一下，&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜進階篇」&lt;/strong&gt; 開放預購啦！&lt;br&gt;
這次選了40道難度加深的LeetCode題目，&lt;br&gt;
同樣也會細部解說對應的技巧及須要掌握的演算法！&lt;br&gt;
同時這次購買進階篇的話，&lt;br&gt;
額外還加贈**「從Leetcode學演算法｜面試篇」** ！&lt;br&gt;
當中包含了&lt;strong&gt;面試準備須知分享&lt;/strong&gt; ，&lt;strong&gt;及訪談國內外不同經驗的工程師&lt;/strong&gt; ，&lt;br&gt;
讓你不論是&lt;strong&gt;想走前端/後端/一般軟工&lt;/strong&gt; 或者是&lt;strong&gt;想找國外的工作&lt;/strong&gt; ，&lt;br&gt;
是&lt;strong&gt;初學想轉職&lt;/strong&gt; 還是&lt;strong&gt;正在工作&lt;/strong&gt; ，都能夠從中得到收穫呦！&lt;br&gt;
有興趣的朋友可以使用下面的早鳥優惠～&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜進階篇」+「從Leetcode學演算法｜面試篇」&lt;/strong&gt; ：&lt;br&gt;
&lt;a class="link" href="https://bit.ly/leetcodeadv" target="_blank" rel="noopener"
&gt;https://bit.ly/leetcodeadv&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;「從Leetcode學演算法」全套(基礎/進階/面試篇)同捆優惠：&lt;/strong&gt;&lt;br&gt;
&lt;a class="link" href="https://bit.ly/leetcodeall" target="_blank" rel="noopener"
&gt;https://bit.ly/leetcodeall&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given a string &lt;code&gt;s&lt;/code&gt; of lower and upper case English letters.&lt;/p&gt;
&lt;p&gt;A good string is a string which doesn’t have &lt;strong&gt;two adjacent characters&lt;/strong&gt; &lt;code&gt;s[i]&lt;/code&gt; and &lt;code&gt;s[i + 1]&lt;/code&gt; where:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0 &amp;lt;= i &amp;lt;= s.length - 2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s[i]&lt;/code&gt; is a lower-case letter and &lt;code&gt;s[i + 1]&lt;/code&gt; is the same letter but in upper-case or &lt;strong&gt;vice-versa&lt;/strong&gt; .&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To make the string good, you can choose &lt;strong&gt;two adjacent&lt;/strong&gt; characters that make the string bad and remove them. You can keep doing this until the string becomes good.&lt;/p&gt;
&lt;p&gt;Return &lt;em&gt;the string&lt;/em&gt; after making it good. The answer is guaranteed to be unique under the given constraints.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Notice&lt;/strong&gt; that an empty string is also good.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: s = &amp;#34;leEeetcode&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: &amp;#34;leetcode&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: In the first step, either you choose i = 1 or i = 2, both will result &amp;#34;leEeetcode&amp;#34; to be reduced to &amp;#34;leetcode&amp;#34;.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: s = &amp;#34;abBAcC&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: We have many possible scenarios, and all lead to the same answer. For example:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;abBAcC&amp;#34; --&amp;gt; &amp;#34;aAcC&amp;#34; --&amp;gt; &amp;#34;cC&amp;#34; --&amp;gt; &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;abBAcC&amp;#34; --&amp;gt; &amp;#34;abBA&amp;#34; --&amp;gt; &amp;#34;aA&amp;#34; --&amp;gt; &amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-3"&gt;Example 3
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: s = &amp;#34;s&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: &amp;#34;s&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="constraints"&gt;Constraints
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;1 &amp;lt;= s.length &amp;lt;= 100&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s&lt;/code&gt; contains only lower and upper case English letters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個字串s，當中含有大小寫的英文字母，&lt;br&gt;
一個好的字串被定義為對於 &lt;strong&gt;0 ≤ i ≤ s.length - 2&lt;/strong&gt; 來說，&lt;br&gt;
兩個相鄰的字元s[i]和s[i+1]不會含有相同字母但大小寫相反的狀況，&lt;br&gt;
例如aA, Cc這種型式。&lt;/p&gt;
&lt;p&gt;要讓字串變好，可以透過每次拿掉兩個相鄰且讓字串變壞的字元達到，&lt;br&gt;
最終得到一個好的字串。&lt;/p&gt;
&lt;p&gt;題目表示給定的題目一定有答案且必然是唯一的。&lt;br&gt;
(空字串也是好的字串)&lt;/p&gt;
&lt;p&gt;說起來這題的標題不禁讓人想到美國總統大選，&lt;br&gt;
不過到現在恐怕已經大勢底定了就是，&lt;br&gt;
這句話恐怕就要成為絕響了吧XD&lt;/p&gt;
&lt;p&gt;扯遠了，我們來看看這題。&lt;/p&gt;
&lt;p&gt;由於它已經保證會有唯一解，&lt;br&gt;
那麼相鄰字元的移除順序理論上並不會影響結果，&lt;br&gt;
所以直觀上好像可以每次掃過一遍字串，&lt;br&gt;
將大小寫相鄰的相同字母移掉就解決了&amp;hellip;&amp;hellip;嗎？&lt;/p&gt;
&lt;p&gt;但這麼做的話，我們會不知道要掃過幾次字串才能夠將所有問題移除完，&lt;br&gt;
因為比如碰到&lt;strong&gt;abBA&lt;/strong&gt; 這樣子的字串，我們要將**’bB’** 移除掉，&lt;br&gt;
才會在下一次發現**’aA’** 可以移除。&lt;/p&gt;
&lt;p&gt;所以為求簡單起見，&lt;br&gt;
我們可以使用一個&lt;strong&gt;Stack&lt;/strong&gt; 來存放已經檢查過的部分，&lt;br&gt;
每次放一個字元到Stack中，存放前將Stack最上面的那個字元，&lt;br&gt;
跟準備要放的字元做比較：&lt;br&gt;
&lt;strong&gt;兩者是相同字母且大小寫相反-&amp;gt;將Stack中最上面的字元pop掉&lt;br&gt;
兩者不需相消-&amp;gt;放入Stack&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;這麼一來，我們就只會放沒有讓字串變壞的字元進到Stack，&lt;br&gt;
同時每次都會拿新的字元跟前面的比對，以排除掉應該移除的部分。&lt;/p&gt;
&lt;p&gt;那麼，怎麼算大小寫相反呢？&lt;br&gt;
除了用upper/lower case相關的函式外，&lt;br&gt;
&lt;strong&gt;在&lt;/strong&gt; &lt;a class="link" href="https://zh.wikipedia.org/wiki/ASCII" target="_blank" rel="noopener"
&gt;&lt;strong&gt;ASCII Code&lt;/strong&gt; &lt;/a&gt;&lt;strong&gt;中，相同大小寫的字母的對應碼會恰巧差32。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;為什麼不是26? 因為中間還有帶一些標點符號。&lt;/strong&gt; Python中我們可以使用ord()來對一個字元取其ASCII Code值，&lt;br&gt;
而在Java中，我們可以視char為一個數字來進行加減運算，&lt;br&gt;
所以直接相加減就可以了。&lt;/p&gt;
&lt;p&gt;可能有讀者會問：&lt;br&gt;
&lt;strong&gt;「那我記不住32這個數字怎麼辦？」&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在寫的過程中，我們也可以用’a’和’A’的位置差算出來，&lt;br&gt;
注意**’a’對應的值是比較大** 的呦！&lt;br&gt;
所以可以將其寫成：&lt;strong&gt;&amp;lsquo;a&amp;rsquo; - &amp;lsquo;A&amp;rsquo; (Java)或 ord(‘a’)- ord(‘A’) (Python)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你再問：&lt;br&gt;
&lt;strong&gt;「那我記不住哪個在前面怎麼辦？」&lt;/strong&gt;&lt;br&gt;
呃……那你只好再&lt;strong&gt;加個絕對值&lt;/strong&gt; 了！&lt;br&gt;
使用Math.abs() (Java) 或 abs() (Python)就可以囉！&lt;/p&gt;
&lt;p&gt;因此，流程大體如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;建立一個stack名為st&lt;/li&gt;
&lt;li&gt;從字串s當中依序取出字元c，進行迴圈：&lt;br&gt;
2-1. 當st不為空，且最上面的值和c的值&lt;strong&gt;相差32&lt;/strong&gt; 時，就對st進行pop&lt;br&gt;
2-2. 否則表示不需消除，將c推入st中(push)&lt;/li&gt;
&lt;li&gt;完成迴圈後，將st的所有字元連起來得到的字串即為答案&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;依此，寫成程式碼如下：&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;p&gt;Java的部分，由於Java的Stack固定從尾端取出，&lt;br&gt;
最終使用StringBuilder進行組合完以後，toString之前記得要reverse，&lt;br&gt;
不然答案就會反掉囉XD！&lt;br&gt;
當然，也可以採用ArrayDeque來做，&lt;br&gt;
這樣就可以從頭排列到尾而不需要反轉。&lt;br&gt;
使用peek()可以幫助我們確認stack的最上面一個值是什麼，&lt;br&gt;
而不會將其取出，同時因不確定大小寫誰在前面，&lt;br&gt;
所以檢查時要記得取絕對值！&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/3c225e5679bc20afbbef6839ca86f140.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;p&gt;Python這邊多加了一條判斷，但其實不影響，&lt;br&gt;
只是s的長度是1或0時都可以直接回傳就是了XD&lt;/p&gt;
&lt;p&gt;我們可以看到對於Python來說好處就是可以直接拿list當stack來使用，&lt;br&gt;
同時，使用join函式可以簡單地將list組成字串。&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/f7e2c4a352a01676f7dde17345c9f762.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N)/O(N)，N為字串長度。Java也可以使用CharAt(i)的型式來處理取出字元的部分，但不影響空間複雜度，因為後面還有其他要組的部分XD)&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;
&lt;p&gt;想看看其他題目嗎？&lt;br&gt;
歡迎從&lt;a class="link" href="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-0/" &gt;&lt;strong&gt;第零篇&lt;/strong&gt; &lt;/a&gt;找你想要的！&lt;/p&gt;
&lt;p&gt;同時追蹤粉專以獲得更多新文章的通知：&lt;br&gt;
&lt;a class="link" href="https://www.facebook.com/learnwithdesolve" target="_blank" rel="noopener"
&gt;&lt;strong&gt;跟著Desolve學程式&lt;/strong&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;另外，&lt;strong&gt;「從Leetcode學演算法｜基礎篇」&lt;/strong&gt; 已經回原價囉，&lt;br&gt;
先前的優惠碼會失效，但這邊仍然為讀者保留了300塊的折抵，&lt;br&gt;
雖然&lt;strong&gt;整捆一起買總體比較划算&lt;/strong&gt; (差290而已就有整組了阿XD)，&lt;br&gt;
如果你還是想先試試基礎課的話，&lt;br&gt;
&lt;strong&gt;300元折抵的連結&lt;/strong&gt; 在這邊：&lt;br&gt;
&lt;a class="link" href="https://bit.ly/1desolve" target="_blank" rel="noopener"
&gt;https://bit.ly/1desolve&lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 12 Linked List (3)/ Stack (1)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-12-linked-list-3-stack-1/</link><pubDate>Fri, 12 Jul 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-12-linked-list-3-stack-1/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 12 Linked List (3)/ Stack (1)" /&gt;&lt;p&gt;&lt;strong&gt;0092. Reverse Linked List II (Medium)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Reverse a linked list from position &lt;em&gt;m&lt;/em&gt; to &lt;em&gt;n&lt;/em&gt;. Do it in one-pass.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; 1 ≤ &lt;em&gt;m&lt;/em&gt; ≤ &lt;em&gt;n&lt;/em&gt; ≤ length of the list.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: 1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;5-&amp;gt;NULL, m = 2, n = 4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 1-&amp;gt;4-&amp;gt;3-&amp;gt;2-&amp;gt;5-&amp;gt;NULL
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個linked list，在只經過一次的操作下(每個node不會額外再走訪)，&lt;br&gt;
題目要求將m到n的位置的節點進行反轉。&lt;/p&gt;
&lt;p&gt;由範例可知這邊的m跟n是以開頭為1而非0來計算，這點讀者請特別留意。&lt;/p&gt;
&lt;p&gt;我們先從理論上來看這題應該怎麼處理：&lt;br&gt;
首先根據題目要求，m可能和n相等，&lt;br&gt;
相等的狀況下其實完全不用做事，回傳head即可。&lt;/p&gt;
&lt;p&gt;那麼如果是不相等的狀況呢？&lt;br&gt;
在Linked List中，要知道某個位置的節點為何，唯有&lt;strong&gt;從頭一路走到該節點&lt;/strong&gt; 。&lt;br&gt;
我們想要反轉的是m&lt;del&gt;n的位置：&lt;br&gt;
以範例來說，會將2&lt;/del&gt;4的位置進行反轉。&lt;br&gt;
如何反轉呢？首先我們要先走到2的左邊，當我們把中間的部分反轉後，&lt;br&gt;
我們還要將它們和左右兩邊接起來，要記得2的左邊跟4的右邊的節點才行。&lt;br&gt;
(不然接不起來就GG了XD)&lt;br&gt;
這邊將2的左邊命名為left，一路往下走的迭代節點命名為node，&lt;br&gt;
走到m-1以前先記錄下left節點，再繼續往下走。&lt;/p&gt;
&lt;p&gt;接下來問題來了，如何將2~4的部分反向連接呢？&lt;br&gt;
你可以選擇一個一個拆解並重新鍵結，&lt;br&gt;
但這裡筆者想介紹一個常用的資料結構：Stack(堆疊，或稱棧/堆棧)。&lt;br&gt;
Stack的樣子，就跟某些苦命的辦公室人員的書桌一樣：&lt;br&gt;
&lt;strong&gt;你會嘗試將書桌上的文件/工作處理完，但老闆總是會往上面再加新的。&lt;/strong&gt; 也就是說，每次如果你選擇&lt;strong&gt;從最上面開始拿&lt;/strong&gt; (別從中間或下面，這麼高的文件可是會塌的！)，你會拿到&lt;strong&gt;最新的&lt;/strong&gt; 工作。&lt;/p&gt;
&lt;p&gt;Stack也是如此，假設你將1, 2, 3, 4, 5依序放入Stack中，那麼當你從Stack裡面拿東西的時候，拿出來的順序會是5, 4, 3, 2, 1。&lt;strong&gt;最後放進去的會最先被拿出來&lt;/strong&gt; ，這樣子的特性我們稱之為Last In First Out(後進先出，簡寫為LIFO)。有另一種資料結構叫&lt;strong&gt;Queue(隊列，或稱佇列)&lt;/strong&gt; 跟它剛好相反，是&lt;strong&gt;先進先出&lt;/strong&gt; ，我們以後找機會再講解它。&lt;/p&gt;
&lt;p&gt;如果這題應用上Stack的話，就簡單許多：&lt;br&gt;
&lt;strong&gt;我們將2~4的部分通通丟進Stack中，再一個一個拿出來&lt;/strong&gt; ，&lt;br&gt;
這時候順序就會變成4, 3, 2了！那麼，只要將剛剛存好的left，以及後面我們邊走邊看到4的時候，將它的右邊記錄起來的node，兩者再和中間的節點連結起來，就完成整個反轉的流程。&lt;/p&gt;
&lt;p&gt;重新整理解題的順序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;判斷m是否和n相等，相等則直接回傳原先的head。&lt;/li&gt;
&lt;li&gt;定義一個迭代用節點node，先走到m-1的位置以取得節點left。&lt;/li&gt;
&lt;li&gt;讓node從m一路走到n，將每個node放入到Stack中。&lt;br&gt;
(註:放入的術語在堆疊中叫作push)&lt;/li&gt;
&lt;li&gt;node再額外走一步會走到n+1的位置&lt;/li&gt;
&lt;li&gt;依次將Stack中的節點取出，並且依序連接所有節點的next，&lt;br&gt;
直到Stack中再也沒有節點。&lt;br&gt;
(註:取出的術語在堆疊中叫做pop)&lt;/li&gt;
&lt;li&gt;將反轉完的尾巴和node做連接，結束整個反轉的流程。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這當中還有額外一點需要注意的是&lt;strong&gt;m=1&lt;/strong&gt; 的狀況，&lt;br&gt;
因為我們最後回傳的是用&lt;strong&gt;head&lt;/strong&gt; 來代表整個linked list，&lt;br&gt;
如果m為1的話，代表head其實已經被改變了，&lt;br&gt;
我們需要同步更新head的部分。&lt;/p&gt;
&lt;p&gt;請參照Java的寫法，我們採用了l1和l2兩個節點來處理依序連接的部分。&lt;br&gt;
我們會先取出堆疊中第一個節點，這個節點會被left連接，&lt;br&gt;
接下來使用&lt;strong&gt;l2 = st.pop(); l1.next=l2; l1 = l2;&lt;/strong&gt;&lt;br&gt;
來進行一次取一個node，將前後連接好以後，&lt;br&gt;
將位置移到下一個準備連接的點。&lt;br&gt;
也就是說，&lt;strong&gt;每次l1所在的位置，都是當前準備進行連接next的節點&lt;/strong&gt; 。&lt;br&gt;
(若讀者對這邊的說明感到抽象，請務必在紙上試著操作一下會較清楚)&lt;/p&gt;
&lt;p&gt;在Java中，Stack的宣告方式是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Stack&amp;lt;&amp;gt; st = new Stack&amp;lt;&amp;gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;請在&amp;quot;&amp;lt;&amp;gt;&amp;ldquo;之中填入你想要使用的資料型態，&lt;br&gt;
在本例中為題目已經定義的class ListNode。&lt;/p&gt;
&lt;p&gt;函式用法的部分，push()用來放入節點，pop()用來取出節點，&lt;br&gt;
isEmpty()則是檢查Stack是否是空的。&lt;br&gt;
(還有一個peek()，是用來看Stack最上面節點，&lt;br&gt;
但不會真的將節點從Stack中移除)&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/5f1c1300afeb8aa6ab4cfabebbb09f28.js"&gt;&lt;/script&gt;
&lt;p&gt;在Python中，list的特性可以方便的用來當作Stack使用，&lt;br&gt;
放入節點可以使用append()，取出節點使用pop()。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/eeb85ba29bb9832ce6143040c9a799be.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N), O(n-m)，因為我們的堆疊最多只需要存中間的部分和兩旁的node)&lt;/p&gt;
&lt;p&gt;「可以只用O(1)的空間嗎？」&lt;br&gt;
(可以，如果我們按順序一個一個處理m~n之間的連結，&lt;br&gt;
最後再將n和m和左右兩邊連起來，是可以不使用Stack的&lt;br&gt;
中間的連接方式會像是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;third = cur.next
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cur.next = prev
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;prev = cur
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cur = third
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;讀者有興趣的話可以嘗試看看。)&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item></channel></rss>