<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Bitwise Operation on 跟著 Desolve 學程式</title><link>https://desolve.pages.dev/tags/bitwise-operation/</link><description>Recent content in Bitwise Operation on 跟著 Desolve 學程式</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Tue, 11 Feb 2020 00:00:00 +0800</lastBuildDate><atom:link href="https://desolve.pages.dev/tags/bitwise-operation/index.xml" rel="self" type="application/rss+xml"/><item><title>從LeetCode學演算法 - 87 Bitwise Operation (6)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-87-bitwise-operation-6/</link><pubDate>Tue, 11 Feb 2020 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-87-bitwise-operation-6/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 87 Bitwise Operation (6)" /&gt;&lt;p&gt;&lt;strong&gt;1342. Number of Steps to Reduce a Number to Zero (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given a non-negative integer &lt;code&gt;num&lt;/code&gt;, return the number of steps to reduce it to zero. If the current number is even, you have to divide it by 2, otherwise, you have to subtract 1 from it.&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;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;6
&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;7
&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;8
&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;9
&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: num = 14
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Step 1) 14 is even; divide by 2 and obtain 7.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Step 2) 7 is odd; subtract 1 and obtain 6.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Step 3) 6 is even; divide by 2 and obtain 3.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Step 4) 3 is odd; subtract 1 and obtain 2.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Step 5) 2 is even; divide by 2 and obtain 1.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Step 6) 1 is odd; subtract 1 and obtain 0.
&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;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;6
&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;7
&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: num = 8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Step 1) 8 is even; divide by 2 and obtain 4.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Step 2) 4 is even; divide by 2 and obtain 2.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Step 3) 2 is even; divide by 2 and obtain 1.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Step 4) 1 is odd; subtract 1 and obtain 0.
&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: num = 123
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 12
&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;= num &amp;lt;= 10^6&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個數字num，回傳其化簡至0所用的步驟數。&lt;br&gt;
化簡的方法為：&lt;br&gt;
若num此刻為偶數，將其除以2；若num此刻為奇數，將其減去1。&lt;/p&gt;
&lt;p&gt;這題如果按照題目的條件一步一步走的話，&lt;br&gt;
以二進位制來看，&lt;br&gt;
我們會發現當尾端的bit是1時，就必須&lt;strong&gt;減去1並除以2&lt;/strong&gt; ，&lt;br&gt;
也就是向右位移一個bit(&lt;strong&gt;這整件事情耗費了2步&lt;/strong&gt; )；&lt;br&gt;
若bit是0時，則只需要除以2即可。&lt;/p&gt;
&lt;p&gt;所以一個很簡單且直觀的寫法，就是利用迴圈，&lt;br&gt;
當num還大於0時，檢查尾數的bit(可以用num &amp;amp; 1取得尾數是0或1)，&lt;br&gt;
你可以用&lt;strong&gt;三元運算子&lt;/strong&gt; ，或者直接**(num &amp;amp; 1) + 1** 亦可，&lt;br&gt;
請注意由於**&amp;amp;運算子的優先序較低** ，務必將num和1用括號包起來！&lt;br&gt;
一路做到最後一個1，最後num等於0時就完成了。&lt;br&gt;
(因為最後一個1不用再位移了，所以我們加總起來的步數最後要減去1)&lt;/p&gt;
&lt;p&gt;這裡提供另一個想法：&lt;br&gt;
當我們沒有限制計算bitCount的函式及轉換二進位/字串時，&lt;br&gt;
可以推想到：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;所有1都必須被消成0 (每個bit &amp;lsquo;1&amp;rsquo;會耗費1步)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;要除以幾次2，端看&lt;strong&gt;最高位的1離個位數有多遠&lt;br&gt;
(轉成二進位的總長減去1等於總共要除以2的次數)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以我們得到： &lt;strong&gt;答案 = num的bit ‘1’數量 + num的長度 - 1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;依此，寫成程式碼如下：&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;p&gt;Java的部分，我們可以利用bitCount和toBinaryString來達到要求。&lt;br&gt;
(一步一步算的也有列出參考解，讀者可以自己試看看)&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/ac7bed87672d4c13dc8df0fb361f460d.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;p&gt;Python的部分，由於bin()轉二進位時，前面會多出**’0b’** ，&lt;br&gt;
所以計算長度時會多出2，&lt;strong&gt;後面的減1就會變成需要改成減3&lt;/strong&gt; ，&lt;br&gt;
請再留意。其他跟Java大同小異。&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/2370b48ca224bdc83884be2e66e770f2.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(logN)/O(1)，但因為num最高就是10^6而已，如果你要宣稱num是constant，因此時間複雜度當成O(1)，個人覺得也是合理的。)&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;From &lt;a class="link" href="https://www.facebook.com/rollfatcat" target="_blank" rel="noopener"
&gt;Cheng Rui Xie&lt;/a&gt; :&lt;br&gt;
位元運算有很多有趣的 function 可以呼叫：&lt;br&gt;
回傳以二為底的次方項：&lt;strong&gt;__lg(num)&lt;/strong&gt;&lt;br&gt;
回傳數字二進位後1的個數：&lt;strong&gt;__builtin_popcount(num)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;只要取兩個的和即可且運算的時間＝O(1) &lt;br&gt;
(這個想法的O(1)也是將num當限定大小看待。)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;
&lt;p&gt;感謝大家對這系列文章的支持！這邊跟大家自我工商一下：&lt;/p&gt;
&lt;p&gt;筆者開設的系列同名線上課程：&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜基礎篇」已經上線啦！&lt;/strong&gt; 在這堂課中，你將學會利用十種演算法/資料結構來優化解題過程，&lt;br&gt;
並實際完整練習&lt;strong&gt;20題&lt;/strong&gt; 精選考古題，&lt;br&gt;
進而逐漸提升到不需提示也可以突破白板題，取得工作門票！&lt;br&gt;
&lt;strong&gt;Medium優惠(最後一波早鳥優惠了，不確定調回原價是什麼時候)：&lt;/strong&gt; &lt;a class="link" href="https://hiskio.com/courses/319?promo_code=VE9Q5VE" target="_blank" rel="noopener"
&gt;** https://hiskio.com/courses/319?promo_code=VE9Q5VE**&lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 68 Bitwise Operation (5)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-68-bitwise-operation-5/</link><pubDate>Mon, 11 Nov 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-68-bitwise-operation-5/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 68 Bitwise Operation (5)" /&gt;&lt;p&gt;&lt;strong&gt;0201. Bitwise AND of Numbers Range (Medium)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given a range [m, n] where 0 &amp;lt;= m &amp;lt;= n &amp;lt;= 2147483647, return the bitwise AND of all numbers in this range, inclusive.&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;/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: [5,7]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 4
&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;/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: [0,1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 0
&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;給定一個範圍m, n，且0≤m≤n≤2147483647(也就是2³¹-1)，&lt;br&gt;
回傳這個範圍內(inclusive，即含n)的所有數字的bitwise AND的結果。&lt;/p&gt;
&lt;p&gt;首先這題要先理解inclusive表示&lt;strong&gt;頭跟尾都要&lt;/strong&gt; ，&lt;br&gt;
例如[5, 7]，其範圍內的所有數字就是5, 6, 7。&lt;br&gt;
再者如前面提到過的&lt;a class="link" href="https://medium.com/p/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-11-bitwise-operation-1-3117c4ce925d" target="_blank" rel="noopener"
&gt;bitwise operation&lt;/a&gt;的部份，&lt;br&gt;
這邊做的是對每個bit一一對應做AND的操作。&lt;/p&gt;
&lt;p&gt;我們先來看一下範例1，將其化成二進位：&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;5 : 101
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;6 : 110
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;7 : 111
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;AND : 100 =&amp;gt; Output: 4
&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;注意到由於AND操作要求&lt;strong&gt;兩個bit都是1結果才是1&lt;/strong&gt; ，&lt;br&gt;
所以&lt;strong&gt;中間一旦出現任意一個0的話，當個bit的AND結果最終必然是0&lt;/strong&gt; 。&lt;br&gt;
由於&lt;/p&gt;
&lt;p&gt;已經知道m≤n了，假設m跟n前面存在一組位元長得一模一樣，&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;/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;m: 100100101000 (2344)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;n: 100100111111 (2367)
&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;可以明顯看出從m到n的部份，&lt;strong&gt;1001001&lt;/strong&gt; 的位元是完全不變的，&lt;br&gt;
&lt;strong&gt;AND出來這部分顯然也會保留&lt;/strong&gt; ，因為每個數字的這部份都一樣。&lt;/p&gt;
&lt;p&gt;那麼後面呢？&lt;br&gt;
由於m ≤ n，&lt;br&gt;
所以在後面不相同的狀況下，開始不相同的&lt;strong&gt;m的第一個bit顯然會是0&lt;/strong&gt; ，&lt;br&gt;
&lt;strong&gt;n的第一個bit顯然會是1&lt;/strong&gt; ，那麼從m一路到n的bit變化，&lt;br&gt;
就必然有從&lt;strong&gt;011…1到100…0&lt;/strong&gt; 的情況，&lt;br&gt;
所以&lt;strong&gt;後面的所有bit皆至少有出現過一次0&lt;/strong&gt; ，&lt;br&gt;
這會使得&lt;strong&gt;後面的區塊經過AND完以後肯定是0&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;所以整個問題就可以化簡成：&lt;br&gt;
找到&lt;strong&gt;m和n的最前面相同的bit，再將後面補上0即為答案&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;要找這個很簡單，&lt;strong&gt;每次檢查m, n是否相等，若否，&lt;br&gt;
則各自向右移動一個bit&lt;/strong&gt;，最終到** m, n相等&lt;strong&gt;時，&lt;br&gt;
只要乘上對應的位移倍數，即為解答。&lt;br&gt;
讀者可以自行選用將factor視為&lt;/strong&gt;位移位數** 或&lt;strong&gt;必須相乘的倍數&lt;/strong&gt; ，&lt;br&gt;
兩者速度基本相似。&lt;/p&gt;
&lt;p&gt;除此之外還有另一個思路，既然我們只是想要n的前面那區bits，&lt;br&gt;
那就一次從n剝離一個bit&lt;br&gt;
( &lt;strong&gt;n &amp;amp;= n-1&lt;/strong&gt; , 先前的題目有提到可以用來一次去除最低位的bit)，&lt;br&gt;
&lt;strong&gt;直到n≤m為止。這時候留下來的n即為答案，因為低位的全被剝離了。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;依此，寫成程式碼。&lt;br&gt;
(三者速度差異不大，但最後一種看起來最簡單，讀者可以自行斟酌選擇)&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/5d6c0a6e95207e3dce83ebc163c05609.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/2ecc74f88ea1421b15bb4c0e11bd21bb.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(n的長度)/O(1)，&lt;br&gt;
因為要做到哪一步端看什麼時候找到m和n前面相同的位置)&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;</description></item><item><title>從LeetCode學演算法 - 67 Bitwise Operation (4)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-67-bitwise-operation-4/</link><pubDate>Tue, 05 Nov 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-67-bitwise-operation-4/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 67 Bitwise Operation (4)" /&gt;&lt;p&gt;&lt;strong&gt;0191. Number of 1 Bits (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Write a function that takes an unsigned integer and return the number of ‘1’ bits it has (also known as the &lt;a class="link" href="http://en.wikipedia.org/wiki/Hamming_weight" target="_blank" rel="noopener"
&gt;Hamming weight&lt;/a&gt;).&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: 00000000000000000000000000001011
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: The input binary string 00000000000000000000000000001011 has a total of three &amp;#39;1&amp;#39; bits.
&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: 00000000000000000000000010000000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: The input binary string 00000000000000000000000010000000 has a total of one &amp;#39;1&amp;#39; bit.
&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;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: 11111111111111111111111111111101
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 31
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: The input binary string 11111111111111111111111111111101 has a total of thirty one &amp;#39;1&amp;#39; bits.
&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;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Note that in some languages such as Java, there is no unsigned integer type. In this case, the input will be given as signed integer type and should not affect your implementation, as the internal binary representation of the integer is the same whether it is signed or unsigned.&lt;/li&gt;
&lt;li&gt;In Java, the compiler represents the signed integers using 2’s &lt;a class="link" href="https://en.wikipedia.org/wiki/Two%27s_complement" target="_blank" rel="noopener"
&gt;complement notation&lt;/a&gt;. Therefore, in &lt;strong&gt;Example 3&lt;/strong&gt; above the input represents the signed integer &lt;code&gt;-3&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個unsigned integer(正整數或0)，試回傳其位元為1的個數。&lt;/p&gt;
&lt;p&gt;這題其實比上一題還要再簡單一點XD&lt;br&gt;
假設我們將數字稱為n，要計算其位元為1的個數的方式一般有兩個：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;看當前的位數是否為1&lt;/strong&gt; 來決定是否遞增記錄累積的cnt(count)，&lt;br&gt;
再將n向右位移1位，直到做完全部32個位元。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;將n每次和n-1相AND，可以去掉最低次的位元。&lt;/strong&gt;&lt;br&gt;
舉例來說：&lt;br&gt;
n=11100 =&amp;gt; 11100 &amp;amp; 11011 = 11000&lt;br&gt;
(減1時最低位的1會被借位，導致該位變成0，&lt;br&gt;
其後的位數變成1，從而在相AND時全都會變成0)&lt;br&gt;
n=10011 =&amp;gt; 10011 &amp;amp; 10010 = 10010&lt;br&gt;
(最低位的1一開始就在最右邊，顯然減完最右邊變成0，&lt;br&gt;
同樣會符合去掉最低次的位元的特性)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/c4e1febe99301d694aeee82c77474182.js"&gt;&lt;/script&gt;
&lt;p&gt;Python的部份，也可以轉成二進位以後再用count去數'1&amp;rsquo;。&lt;br&gt;
(不需要考慮前面的0b因為沒差XD)&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/813fd4dc1b16e354c19a98f261d6c12e.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(1)/O(1)，因最多32次迴圈就結束了XD)&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;/strong&gt; 這題其實一樣可以有更精妙的解法，但同樣不建議在面試時使用。&lt;br&gt;
(除非你要面試的就是非常在乎效能加速的公司)請參見JDK所使用的&lt;strong&gt;Integer.bitCount()&lt;/strong&gt; 函式原始碼講解：&lt;br&gt;
&lt;a class="link" href="https://juejin.im/post/5c3969b76fb9a049a5712060" target="_blank" rel="noopener"
&gt;https://juejin.im/post/5c3969b76fb9a049a5712060&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 66 Bitwise Operation (3)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-66-bitwise-operation-3/</link><pubDate>Sat, 02 Nov 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-66-bitwise-operation-3/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 66 Bitwise Operation (3)" /&gt;&lt;p&gt;&lt;strong&gt;0190. Reverse Bits (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Reverse bits of a given 32 bits unsigned integer.&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: 00000010100101000001111010011100
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 00111001011110000010100101000000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: The input binary string 00000010100101000001111010011100 represents the unsigned integer 43261596, so return 964176192 which its binary representation is 00111001011110000010100101000000.
&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: 11111111111111111111111111111101
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 10111111111111111111111111111111
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: The input binary string 11111111111111111111111111111101 represents the unsigned integer 4294967293, so return 3221225471 which its binary representation is 10111111111111111111111111111111.
&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;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Note that in some languages such as Java, there is no unsigned integer type. In this case, both input and output will be given as signed integer type and should not affect your implementation, as the internal binary representation of the integer is the same whether it is signed or unsigned.&lt;/li&gt;
&lt;li&gt;In Java, the compiler represents the signed integers using 2’s &lt;a class="link" href="https://en.wikipedia.org/wiki/Two%27s_complement" target="_blank" rel="noopener"
&gt;complement notation&lt;/a&gt;. Therefore, in &lt;strong&gt;Example 2&lt;/strong&gt; above the input represents the signed integer &lt;code&gt;-3&lt;/code&gt; and the output represents the signed integer &lt;code&gt;-1073741825&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;題目要求將一個32bit長度的integer進行反轉。&lt;br&gt;
(也就是將二進位制的各個bit 0變成1，1變成0)&lt;/p&gt;
&lt;p&gt;先前我們談過二進位的問題，以及一些&lt;a class="link" href="https://medium.com/@desolution/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-11-bitwise-operation-1-3117c4ce925d" target="_blank" rel="noopener"
&gt;&lt;strong&gt;位元運算&lt;/strong&gt; &lt;/a&gt;。&lt;br&gt;
如果這題有要求處理正負號的問題的話，就會稍微複雜一點，&lt;br&gt;
因為如題目提示的說明，Java中的有號的integer會使用**二補數&lt;br&gt;
(2’s complement)**來表示，這件事情隱含了如果將bit位移時，&lt;br&gt;
需要考慮是&amp;raquo;或&amp;raquo;&amp;gt;的問題。&lt;br&gt;
&lt;strong&gt;負數使用&amp;raquo;時最高位會補1，而&amp;raquo;&amp;gt;時最高位會補0&lt;/strong&gt; ，&lt;br&gt;
由於最高位用來記錄正負號，這會影響到實際得到的結果。&lt;/p&gt;
&lt;p&gt;但我們這邊單純只是要將整個32 bit順序反過來的話就沒有太大問題XD&lt;/p&gt;
&lt;p&gt;我們先從簡單一點的開始，&lt;br&gt;
比如有一個數字n是1001100(也就是十進制的76)，&lt;br&gt;
假設我們要將這7個bit反轉，應該要得到0011001，這個過程怎麼來的呢？&lt;/p&gt;
&lt;p&gt;先將我們的答案叫做r(result)，一開始為0，我們先這樣表示：&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;r:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;n: 1001100
&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;接下來我們要找下一個對應的bit的話，&lt;br&gt;
n必須要取最右邊的bit才行，記錄完以後，&lt;br&gt;
為了讓下一次的n的最右邊依然是我們要的bit，&lt;br&gt;
可以將n進行一次向右位移，即可對到最右邊。&lt;br&gt;
另外，r為了要記錄下一個位元，每次要向左位移一格，空出最右邊來。&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;r: 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;n: 100110
&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;重複相同的操作，直到n等於0或全部位元操作完畢即可。&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;r: -&amp;gt; 0 -&amp;gt; 00 -&amp;gt; 001 -&amp;gt; 0011 -&amp;gt; 00110 -&amp;gt; 0011001
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;n:1001100 -&amp;gt; 100110 -&amp;gt; 10011 -&amp;gt; 1001 -&amp;gt; 100 -&amp;gt; 10 -&amp;gt; 1 -&amp;gt; 0
&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;觀察上面的規律，我們可以歸納出對32位元的操作：&lt;br&gt;
&lt;strong&gt;1. 令res為0&lt;br&gt;
2. 執行32次以下的迴圈：&lt;br&gt;
2–1. res向左位移1位&lt;br&gt;
2–2. 將n的最右邊的bit加到res上&lt;br&gt;
2–3. 將n向右位移1位&lt;br&gt;
3. 最終res即為答案&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;依此，可以寫成如下的程式碼：&lt;br&gt;
Java的部分，我們使用&amp;laquo;=和&amp;raquo;=進行各自位移後再回存。&lt;br&gt;
而對應到2-2的部分，除了如第8行的寫法，&lt;br&gt;
&lt;strong&gt;將n和1進行AND運算&lt;/strong&gt; 來確認&lt;strong&gt;最右邊的位元&lt;/strong&gt; 以外，&lt;br&gt;
也可以用&lt;strong&gt;AND完以後跟res進行OR&lt;/strong&gt; 的方法。&lt;br&gt;
此外，由於最開始res是0，&lt;br&gt;
所以先將其往左位移一次是不會對答案造成影響的。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/df6aea77c9766e076286ff7e63040780.js"&gt;&lt;/script&gt;
&lt;p&gt;Python的部分提供一個看到比較特別的寫法：&lt;br&gt;
使用format將n進行轉換，&lt;br&gt;
當中0:032b的&lt;strong&gt;第一個0可以不用寫&lt;/strong&gt; (因為format中也只有一個數字)，&lt;br&gt;
&lt;strong&gt;第二個0代表多出來的部份必須進行補0&lt;/strong&gt; (補完反轉才不會有問題)，&lt;br&gt;
轉成32位的bit後，將其從尾往頭擺順序，&lt;br&gt;
再用int轉換回integer(指定前面那段是二進制)即可。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/047e6a2806862ee268d066c9b5f74816.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N)/O(N)，因為必然經過每個位元)&lt;/p&gt;
&lt;p&gt;「如果檢查n是否為0做為結束條件，執行速度是否會較快？」&lt;br&gt;
(不一定，要看n反轉後的最接近高位的0有多接近，&lt;br&gt;
否則每次多檢查一次未必比較快)&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;
From&lt;/strong&gt; &lt;a class="link" href="https://www.facebook.com/groups/programmerMagazine/?ref=group_header" target="_blank" rel="noopener"
&gt;** 程式人雜誌 — 公益出版**&lt;/a&gt; ** - Novus Chou**:&lt;br&gt;
「 &lt;strong&gt;現實中比較講究的位元操作，會盡可能一次處理多位元，&lt;br&gt;
而且最好不動用迴圈。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;以 8 bit 為例&lt;/p&gt;
&lt;p&gt;12345678&lt;br&gt;
=&amp;gt; &lt;strong&gt;21&lt;/strong&gt; 436587 (奇偶交換)&lt;br&gt;
=&amp;gt; 43&lt;strong&gt;21&lt;/strong&gt; 8765 (兩兩一組交換)&lt;br&gt;
=&amp;gt; 8765&lt;strong&gt;4321&lt;/strong&gt; (前後半交換)&lt;/p&gt;
&lt;p&gt;類似 C 風格的寫法大概長這樣，&lt;br&gt;
最後一輪利用整數自然截位所以不用 mask（當然這點要看語言特性）。&lt;/p&gt;
&lt;p&gt;x = (((x &amp;amp; 0xAA) &amp;raquo; 1) | ((x &amp;amp; 0x55) &amp;laquo; 1));&lt;br&gt;
x = (((x &amp;amp; 0xCC) &amp;raquo; 2) | ((x &amp;amp; 0x33) &amp;laquo; 2));&lt;br&gt;
x = (x &amp;raquo; 4) | (x &amp;laquo; 4);&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;更快的作法就是半查表，也就是把問題分解到某階段改用查的。&lt;/strong&gt; 」&lt;br&gt;
(註：利用連續的bit mask進行處理，可達到交換的目的，&lt;br&gt;
這個方法對於&lt;strong&gt;在意效能&lt;/strong&gt; 來說，&lt;br&gt;
由於&lt;strong&gt;if/while/for&lt;/strong&gt; 等&lt;strong&gt;需要判斷&lt;/strong&gt; 或&lt;strong&gt;有分歧狀況&lt;/strong&gt; 的程式碼，&lt;br&gt;
皆須花費相對於位元運算而言&lt;strong&gt;較多&lt;/strong&gt; 的時間，&lt;br&gt;
能夠單純利用位元運算達成互換會是在實際狀況較棒的解法。)&lt;/p&gt;
&lt;p&gt;(但，其實沒特別用過的話，面試時其實頗難回想出這種解法就是了XD)&lt;br&gt;
&lt;strong&gt;有興趣的話可以參考這兩篇：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://leetcode.com/problems/reverse-bits/discuss/54741/O%281%29-bit-operation-C%2B%2B-solution-%288ms%29" target="_blank" rel="noopener"
&gt;https://leetcode.com/problems/reverse-bits/discuss/54741/O(1)-bit-operation-C%2B%2B-solution-(8ms)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://leetcode.com/problems/reverse-bits/discuss/54746/Java-Solution-and-Optimization" target="_blank" rel="noopener"
&gt;https://leetcode.com/problems/reverse-bits/discuss/54746/Java-Solution-and-Optimization&lt;/a&gt; &lt;strong&gt;底下的&lt;/strong&gt; &lt;a class="link" href="https://leetcode.com/dugu9sword" target="_blank" rel="noopener"
&gt;** dugu9sword**&lt;/a&gt; ** 的回應**&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;另外，Java中內建的&lt;strong&gt;bitCount&lt;/strong&gt; 函式(計算某個數的二進位制含有1的數量)，&lt;br&gt;
也運用了類似的手法達到目的。&lt;br&gt;
參見： &lt;a class="link" href="https://www.jishuwen.com/d/2HPI/zh-tw" target="_blank" rel="noopener"
&gt;https://www.jishuwen.com/d/2HPI/zh-tw&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&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;如果你／妳覺得這篇文章不錯，請給我5個Like。(點開SHOW EMBED!)
&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;</description></item><item><title>從LeetCode學演算法 - 15 Bitwise Operation (2)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-15-bitwise-operation-2/</link><pubDate>Thu, 18 Jul 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-15-bitwise-operation-2/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 15 Bitwise Operation (2)" /&gt;&lt;p&gt;&lt;strong&gt;0136. Single Number (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given a &lt;strong&gt;non-empty&lt;/strong&gt; array of integers, every element appears &lt;em&gt;twice&lt;/em&gt; except for one. Find that single one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?&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;/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: [2,2,1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 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;/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: [4,1,2,1,2]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 4
&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;給定一個非空的整數陣列，當中每個元素都出現兩次，只有一個出現一次而已，題目要求找出那個單獨的數字。&lt;/p&gt;
&lt;p&gt;在進一步往BST之前，先來一個簡單但一般不會想到的問題。&lt;br&gt;
這題如果我們以暴力法來解的話，假設不用任何額外的資料結構，我們可以每拿一個數字就對整個陣列做比較，直到找到沒有重複的數字為止。但這樣除了時間複雜度會是O(N)以外(對單一數字，所以每個數字都做完就是O(N^2))，最後會發現有可能會有拿到先前拿過一次的數字，所以顯然是不太行的。&lt;/p&gt;
&lt;p&gt;那輔以資料結構呢？&lt;br&gt;
比較常用的方法是使用HashMap(Python則用dict)，為每個數字計數，計數完以後就掃過整個對應，看誰只有被數到一次，就是我們要的答案了。&lt;br&gt;
這個方法要先走訪過一遍陣列，再走訪一遍HashMap或dict，時間/空間複雜度均為O(N)，但還是稍嫌慢了一些。&lt;/p&gt;
&lt;p&gt;那有沒有更厲害的解法呢？有！&lt;br&gt;
要了解這個解法怎麼操作，首先我們需要複習一下&lt;a class="link" href="https://medium.com/@desolution/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-11-bitwise-operation-1-3117c4ce925d?source=friends_link&amp;amp;sk=0667ce4030f73468b0ced9961341531d" target="_blank" rel="noopener"
&gt;Bitwise Operation&lt;/a&gt;。&lt;br&gt;
當中的XOR的內容是：將兩個數的每個位元兩兩相對，&lt;strong&gt;一個0一個1的時候，結果會是1，否則結果會是0&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;/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;a XOR a = 0
&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;我們拿11=1011(二進位)來試試看：&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;/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;11 = 1011
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;11 = 1011
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;11 XOR 11 = 0000 = 0
&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;因為每一位數都相同，XOR後每一位就都會是0。&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;/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;0 XOR a = a, a XOR 0 = a
&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;因為一邊都是0，所以那個位數是0或1，端看原先a的位元。&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;/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;a XOR b = b XOR a (交換律)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&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;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;(a XOR b) XOR c = a XOR (b XOR c) = a XOR (c XOR b) = a XOR c XOR b
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(不論哪邊先做，結果都是看有奇數個1-&amp;gt;結果是1，偶數個1-&amp;gt;結果是0)
&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;推而廣之，我們可以得到XOR具有&lt;strong&gt;交換律&lt;/strong&gt; 和&lt;strong&gt;結合律&lt;/strong&gt; 。將它的運算的數字左右調換，或者哪個先做，哪個後做，均不影響結果。&lt;/p&gt;
&lt;p&gt;回到問題來，假設我們目標的答案是r，那麼將陣列中所有的數字XOR起來，會發生什麼事情呢？我們根據前面的已知，將陣列自己調換一下，應該可以變成：&lt;br&gt;
r XOR a XOR a XOR b XOR b XOR c XOR c ……的形式。&lt;br&gt;
(因為怎麼換都不應該影響結果)&lt;/p&gt;
&lt;p&gt;於是，陣列全部XOR的結果會等於r XOR 0 XOR 0 XOR…… = r&lt;br&gt;
(其它的兩兩XOR後會變0)&lt;br&gt;
也就是說，將每個數都進行XOR後，結果會留存下那個唯一單獨的數字。&lt;br&gt;
寫成程式碼如下，宣告變數為0後從index 0開始，或直接將陣列的第一個數指派給它並從index 1開始，實測上沒有特別感受到時間差異，讀者依照自己的喜好和習慣嘗試即可。&lt;/p&gt;
&lt;p&gt;Java的部分用了&lt;strong&gt;語法蜜糖&lt;/strong&gt; ，&lt;br&gt;
int e:nums代表自nums陣列按順序每次拿一個數並交給e。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/9ae77bff607f5d3243779d67ba1862fc.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/62526f397d56b25b4d29d5a07fc2fa5e.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(由於只要整個陣列掃過一次就結束了且無須額外的陣列空間，&lt;br&gt;
時間複雜度為O(N)，空間複雜度則為O(1))&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;
&lt;p&gt;註：感謝&lt;a class="link" href="https://medium.com/@zhoumax" target="_blank" rel="noopener"
&gt;zhoumax&lt;/a&gt;的提醒修正一些敘述和筆誤。&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 11 Bitwise Operation (1)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-11-bitwise-operation-1/</link><pubDate>Thu, 11 Jul 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-11-bitwise-operation-1/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 11 Bitwise Operation (1)" /&gt;&lt;p&gt;&lt;strong&gt;0089. Gray Code (Medium)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;The gray code is a binary numeral system where two successive values differ in only one bit.&lt;/p&gt;
&lt;p&gt;Given a non-negative integer &lt;em&gt;n&lt;/em&gt; representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.&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;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;6
&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;7
&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: 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: [0,1,3,2]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;00 - 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;01 - 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;11 - 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;10 - 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;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;For a given n, a gray code sequence may not be uniquely defined.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;For example, [0,2,3,1] is also a valid gray code sequence.
&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;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;00 - 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;10 - 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;11 - 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;01 - 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;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: 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: [0]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: We define the gray code sequence to begin with 0.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; A gray code sequence of n has size = 2n, which for n = 0 the size is 20 = 1.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Therefore, for n = 0 the gray code sequence is [0].
&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;格雷碼是一個二進位表示的編碼系統，當中每個連續(相鄰)的二個值之間的表示方式只會相差一個位元(bit)。題目給定n個bits，試求出其表達的格雷碼序列。(格雷碼序列一定是從0開始)&lt;/p&gt;
&lt;p&gt;在這邊簡單講解一下Bitwise Operation。&lt;br&gt;
(註:本題雖然不會用到太多，&lt;br&gt;
但熟悉這些操作對於一些題目和實際應用上很有幫助，&lt;br&gt;
故在此先行列出給讀者學習。)&lt;/p&gt;
&lt;p&gt;先前的文章中已經提到了，電腦對於二進位制的東西操作起來是較為得心應手的，當然我們可以不用像電腦這麼熟悉，但只要會用就可以了XD&lt;br&gt;
二進位之間的一些操作運算，就像是邏輯學上的運算一樣，&lt;br&gt;
有AND/OR/NOT/XOR，以及位移運算(bit shifts)等，這些速度在相同狀況下是由CPU進行支援的，運算速度往往會比一般的四則運算還快。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AND(且):&lt;/strong&gt;&lt;br&gt;
邏輯上的AND，代表著&lt;strong&gt;前後皆為真的狀況結果才為真，否則為假&lt;/strong&gt; ，&lt;br&gt;
也就是兩者皆成立才行。在位元運算中，1被視為真，0被視為假。&lt;br&gt;
(所以在如C/C++中你可能會看到使用IF 1或IF 0的開關)&lt;br&gt;
延伸到多個bit的狀況，就是將前後兩者每個bit兩兩相對，&lt;br&gt;
當兩者為1時，運算完的那個新的bit為1，否則為0。&lt;br&gt;
如 110 AND 100的結果會是100(只有最左邊的bit是兩個1)&lt;br&gt;
&lt;strong&gt;Java和Python中的AND運算符號均為&amp;quot;&amp;amp;&amp;quot;&lt;/strong&gt; 。&lt;br&gt;
(請留意，如果判斷兩個&lt;strong&gt;運算結果的是否為真&lt;/strong&gt; 的邏輯運算，&lt;br&gt;
&lt;strong&gt;Java是&amp;quot;&amp;amp;&amp;amp;&amp;quot;，Python則是&amp;quot;and&amp;quot;&lt;/strong&gt; ，&lt;br&gt;
以位元為基準的運算和求真偽的邏輯運算是不同的，記得不要搞混了！)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OR(或):&lt;/strong&gt;&lt;br&gt;
前後兩者只要其一為真結果即為真，&lt;br&gt;
也就是&lt;strong&gt;只有兩者皆不成立時，結果才會是假&lt;/strong&gt; 。&lt;br&gt;
所以在位元運算中，&lt;br&gt;
兩兩相對，&lt;strong&gt;除了兩個bit都是0的運算結果是0外，其餘都會是1&lt;/strong&gt; 。&lt;br&gt;
如 110 OR 100的結果會是110(只有最右邊的bit是兩個0)&lt;br&gt;
&lt;strong&gt;Java和Python中的OR運算符號均為&amp;quot;|&amp;quot;&lt;/strong&gt; 。&lt;br&gt;
(如果是邏輯運算的話，&lt;strong&gt;Java是&amp;quot;||&amp;quot;，Python則是&amp;quot;or&amp;quot;&lt;/strong&gt; )&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOT(非):&lt;/strong&gt;&lt;br&gt;
邏輯上的NOT，代表將該真/假狀況轉為&lt;strong&gt;原先的相反&lt;/strong&gt; ，&lt;br&gt;
&lt;strong&gt;真的變假的，假的變真的&lt;/strong&gt; 。&lt;br&gt;
在位元運算中，對每個bit操作，&lt;br&gt;
&lt;strong&gt;只要原先是1的均變為0，為先為0的則變為1&lt;/strong&gt; 。&lt;br&gt;
如NOT 110的結果會是001。&lt;br&gt;
&lt;strong&gt;Java和Python中NOT運算符號均為&amp;quot;~&amp;quot;&lt;/strong&gt; 。&lt;br&gt;
(如果是邏輯運算的話，&lt;strong&gt;Java是&amp;quot;!&amp;quot;，Python則是&amp;quot;not&amp;quot;&lt;/strong&gt; )&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;XOR(互斥或，Exclusive OR):&lt;/strong&gt;&lt;br&gt;
邏輯上的XOR，代表&lt;strong&gt;前後兩個狀況剛好有一個成立時為真&lt;/strong&gt; ，&lt;br&gt;
即前真後假/前假後真，其餘皆為假。&lt;br&gt;
位元運算的部分，兩兩相對檢查，當發現是一個1一個0的時候，&lt;br&gt;
結果為1，否則均為0。&lt;br&gt;
如1100 XOR 1010的結果會是0110。&lt;br&gt;
&lt;strong&gt;Java和Python中的XOR運算符號均為&amp;quot;^&amp;quot;&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;位移運算:&lt;/strong&gt;&lt;br&gt;
將一個數的所有bit的東西往左或往右移動指定的位元數，&lt;br&gt;
超出儲存空間的部分捨棄，被位移走的原處則補0。&lt;br&gt;
&lt;strong&gt;Java和Python中使用&amp;quot;&amp;laquo;&amp;ldquo;和&amp;rdquo;&amp;raquo;&amp;ldquo;分別代表向左位移及向右位移。&lt;/strong&gt;&lt;br&gt;
例如:&lt;br&gt;
 2 &amp;laquo; 1 的結果會是4，因為2的二進位是&amp;quot;10&amp;rdquo;，&lt;br&gt;
這個操作代表2向左位移1個bit，空白的部分補零，&lt;br&gt;
所以會得到&amp;quot;100&amp;quot;也就是十進位制的4。&lt;/p&gt;
&lt;p&gt;9 &amp;raquo; 2的結果會是2，因為9的二進位是&amp;quot;1001&amp;quot;，&lt;br&gt;
這個操作代表向右位移2個bit，所以&amp;quot;01&amp;quot;的部分移出儲存範圍了被捨棄掉，&lt;br&gt;
會得到&amp;quot;10&amp;quot;，也就是十進位的2。&lt;/p&gt;
&lt;p&gt;直觀上我們可以將位移N個bit視作乘以或除以2的N次方，&lt;br&gt;
但要注意範圍是否正確，以及是否要&lt;strong&gt;處理正負號&lt;/strong&gt; 的部分。&lt;/p&gt;
&lt;p&gt;上面介紹了位元運算以後，讓我們回到題目。&lt;br&gt;
在通訊傳輸的過程中，有可能因為受到雜訊干擾等狀況，&lt;br&gt;
使得當中的位元反轉(0變成1，1變成0)。倘若我們按照正常的表達方式，&lt;br&gt;
例如7=0111, 8=1000，對於某些臨界狀況而言，小範圍的變動值會需要大幅度的修改bit，同時當某個高位數的bit出錯的狀況，值就有可能受到大幅度的改變，這顯然是比較糟糕的。&lt;/p&gt;
&lt;p&gt;所以格雷碼的設計就是希望能夠讓更動小數值的時候，只更動較少的bit數量即可，且當有其中的bit受到干擾而出錯時，數值的影響範圍也較小。&lt;/p&gt;
&lt;p&gt;那怎麼計算呢？&lt;br&gt;
我們從1個bit開始推導看看：&lt;br&gt;
由於要求要從0開始，&lt;br&gt;
故我們應該是拿0代表0，1代表1，這樣就完成了1個bit的格雷碼。&lt;br&gt;
2個bit的話，由於用10來表示會一次更動2個bit(01-&amp;gt;10)，&lt;br&gt;
所以我們只能拿11來表示2，而10則表示3。&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;00 - 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;01 - 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;11 - 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;10 - 3
&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;當然，也可以用00, 10, 11, 01來進行表示，但這種方式相對較複雜，&lt;br&gt;
我們直接去考慮前面的方式的邏輯就好。&lt;/p&gt;
&lt;p&gt;再來我們可以思考，在不要動到前面的數的狀況下，&lt;br&gt;
下面我們要怎麼表達3個bit的狀況呢？&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;000 - 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;001 - 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;011 - 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;010 - 3
&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;我們想要剛好用3個bit表示0&lt;del&gt;7，&lt;br&gt;
那唯有讓4&lt;/del&gt;7的部分的最左邊的bit均為1才行。&lt;br&gt;
(因為前面的2個bit組合已經被用過了)&lt;br&gt;
同時我們又想要符合&lt;strong&gt;相鄰只動一個bit&lt;/strong&gt; 的原則，&lt;br&gt;
所以4的表示方式就只剩下110了!&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;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;6
&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;7
&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;8
&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;000 - 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;001 - 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;011 - 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;010 - 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;110 - 4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1xx - 5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1xx - 6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1xx - 7
&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;同時，我們也知道前面0&lt;del&gt;3符合這個只動一個bit的表達方式，&lt;br&gt;
那麼後面填入5&lt;/del&gt;7的方式，就可以按照&lt;strong&gt;上下鏡向&lt;/strong&gt; 的狀況填入，&lt;br&gt;
自然會符合格雷碼的要求。也就是除了最左邊是1以外，&lt;br&gt;
4對應到3，5就對應到2，6對應到1，7對應到0即可。&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;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;6
&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;7
&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;8
&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;000 - 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;001 - 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;011 - 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;010 - 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;110 - 4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;111 - 5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;101 - 6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;100 - 7
&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;同樣的道理，變成4個bit時，將後面的8個數的最左邊的bit填入1，&lt;br&gt;
其它的部分鏡向填入即可。&lt;/p&gt;
&lt;p&gt;歸納一下這題的解法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先放入0(最開始的部分，也是n=0時的解答)&lt;/li&gt;
&lt;li&gt;定義一個變數adder，用來表示這輪要加上去的bit所代表的值&lt;br&gt;
(初始值是2的0次方=1)&lt;/li&gt;
&lt;li&gt;每次將答案的尾端加上一個新的值，&lt;br&gt;
這個新的值是鏡向對應到的值加上adder。&lt;br&gt;
(鏡向對應的方式，可以從尾端開始往回算，或者用adder-1-index來計算)&lt;/li&gt;
&lt;li&gt;計算完畢一輪以後，將adder變為2倍，作為下一輪要額外加上去的值。&lt;/li&gt;
&lt;li&gt;一路操作直到完成n輪為止，最後將結果回傳。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/eca8cea11c9b42f8b4d63891a214e54a.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/9183373eb4afe383040d4ae9d2ccd1a2.js"&gt;&lt;/script&gt;
&lt;p&gt;讀者可以看到兩個解法中一個使用+adder，另一個使用|add，&lt;br&gt;
結果上是一樣的，因為加上去的那個bit一定是跟0相加，&lt;br&gt;
故可以用OR運算會加快一點速度。(讀者可以修改成+來比較看看速度)&lt;br&gt;
*2和&amp;laquo;=1的部分，同樣可以等價於位移一個bit，&lt;br&gt;
但速度上應該不會有特別差異才對。&lt;/p&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間複雜度？」&lt;br&gt;
(O(2的n次方)，因為n個bit可以表示2的n次方個數)&lt;/p&gt;
&lt;p&gt;「(Python)能不能不要用append來解？」&lt;br&gt;
(可以用extend，&lt;br&gt;
每次將res的部分反轉接上後，再進行add的加總)&lt;/p&gt;
&lt;p&gt;「為什麼你要用&amp;quot;_&amp;quot;？」&lt;br&gt;
(因為第一個迴圈事實上只是處理執行n次這件事情，&lt;br&gt;
我們並不需要用到其數值，在習慣上會盡量用底線來命名，&lt;br&gt;
避免去用到有意義的命名方式。)&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item></channel></rss>