<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>String Manipulation on 跟著 Desolve 學程式</title><link>https://desolve.pages.dev/tags/string-manipulation/</link><description>Recent content in String Manipulation on 跟著 Desolve 學程式</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Fri, 05 Jul 2019 00:00:00 +0800</lastBuildDate><atom:link href="https://desolve.pages.dev/tags/string-manipulation/index.xml" rel="self" type="application/rss+xml"/><item><title>從LeetCode學演算法 - 8 String Manipulation (1)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-8-string-manipulation-1/</link><pubDate>Fri, 05 Jul 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-8-string-manipulation-1/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 8 String Manipulation (1)" /&gt;&lt;p&gt;&lt;strong&gt;0067. Add Binary (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given two binary strings, return their sum (also a binary string).&lt;/p&gt;
&lt;p&gt;The input strings are both &lt;strong&gt;non-empty&lt;/strong&gt; and contain only characters &lt;code&gt;1&lt;/code&gt; or &lt;code&gt;0&lt;/code&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;/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: a = &amp;#34;11&amp;#34;, b = &amp;#34;1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: &amp;#34;100&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;/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: a = &amp;#34;1010&amp;#34;, b = &amp;#34;1011&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: &amp;#34;10101&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="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;題目給定兩個二進位字串，試求其和(同樣以二進位字串表達)。&lt;br&gt;
在電腦的世界裡，本質上是由0和1所構成的，因為對它來說，最容易的表達方式就是電路的開路和斷路兩種狀態。&lt;br&gt;
如果大家忘記二進位的表示方式，可以從&lt;a class="link" href="https://en.wikipedia.org/wiki/Binary_number" target="_blank" rel="noopener"
&gt;wiki的說明&lt;/a&gt;大概回憶一下XD&lt;br&gt;
這裡只要知道要轉為10進位的話，就是由右至左從2⁰開始相乘相加就對了。&lt;br&gt;
例: 1010 -&amp;gt; 0*2⁰ + 1*2¹ + 0*2² + 1*2³ = 0 + 2 + 0 + 8 = 10&lt;br&gt;
每個位數之間是2倍，每滿2就要向左邊進一位。&lt;/p&gt;
&lt;p&gt;那麼給定的是字串的話，要怎麼做處理呢？&lt;br&gt;
這題很重要的一點是要先確認你是使用什麼程式語言做操作的。&lt;/p&gt;
&lt;p&gt;如果是C/C++/Java等規範相對嚴格的語言的話，&lt;br&gt;
以&lt;strong&gt;Java&lt;/strong&gt; 為例，其int變數型態一般是用&lt;strong&gt;32-bit&lt;/strong&gt; 來儲存並且含有正負號，&lt;br&gt;
也就是它只可以接受範圍在**-2³¹~2³¹-1** 之間的數字，超過這個範圍即會overflow(溢位)，這也是這個題目之所以會用字串表達的原因。&lt;br&gt;
&lt;strong&gt;(不同的語言的int變數所涵蓋的範圍不一定相同)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Python就沒有這種限制，直譯器已經處理好很多事情了，&lt;br&gt;
所以下面就會看到一些比較簡單(偷吃步)的做法。&lt;/p&gt;
&lt;p&gt;對Java而言，我們既然擔心會溢位導致不能夠直接轉換，&lt;br&gt;
那麼只好一位一位去做操作了。我們可以使用StringBuilder這個處理字串的類別，從第0位開始將兩邊的數字相加，並且處理進位(carry)的部分。&lt;/p&gt;
&lt;p&gt;對Java而言，字串(String)拆出來的每個單位叫字元(char)，&lt;br&gt;
使用String.charAt(i)函式，可以將index i的字元拆解出來。&lt;br&gt;
拆出來的字元其實已經可以用數字的形態印出了，&lt;br&gt;
但它是代表&lt;a class="link" href="https://zh.wikipedia.org/wiki/ASCII" target="_blank" rel="noopener"
&gt;ASCII code表&lt;/a&gt;上的位置，而非真的數字，&lt;br&gt;
要得到它實際的數字的話，由於'0&amp;rsquo;~&amp;lsquo;9&amp;rsquo;在表上是連續的，&lt;br&gt;
我們可以減去'0&amp;rsquo;的位置48，即可得到實際的數字；&lt;br&gt;
或者記不了的話，&lt;strong&gt;直接拿該字元去減掉'0&amp;rsquo;&lt;/strong&gt; ，也可以得到相同的結果。&lt;br&gt;
這樣的操作也適用於大小寫的英文字母上，請多留意。&lt;/p&gt;
&lt;p&gt;那麼問題就簡單了: 只要是還有位數的狀況下，就取出字元減掉'0&amp;rsquo;，&lt;br&gt;
否則就當作是0(代表另一個字串比較長)，最後比到兩邊長度都用完，&lt;br&gt;
這時候StringBuilder應該沿路將所有位數從&lt;strong&gt;最低位組合到最高位&lt;/strong&gt; 了，&lt;br&gt;
最後處理最高位有可能的進位後，只要再將其進行反轉(reverse)操作，&lt;br&gt;
再轉為字串(toString)即可。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/cc6b5ff550d626da5c2a62a2949f3e9a.js"&gt;&lt;/script&gt;
&lt;p&gt;Python的部分相對簡單的多(可以偷吃步XD)，&lt;br&gt;
只要將a跟b先轉成int，相加後再轉成二進位即可。&lt;br&gt;
轉成int的作法是&lt;strong&gt;int(num, base)&lt;/strong&gt; ，&lt;br&gt;
num表示你的字串，base表示這段字串的&lt;strong&gt;進位方式&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;相加後轉成bin要特別注意Python的表達方式是以**’0b’** 為開頭，&lt;br&gt;
所以我們只保留index 2以後的部分。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/4aa0af1b415afafdcac2e2366321e69f.js"&gt;&lt;/script&gt;
&lt;p&gt;簡單吧!&lt;/p&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間複雜度？」( O(max(len(a), len(b))) )&lt;/p&gt;
&lt;p&gt;「Python解是很簡單啦，但可以用一個一個比較的方法嗎？」&lt;br&gt;
(請仿照Java的方式寫給他XD)&lt;br&gt;
(補充: Python的ASCII和數字順序的互轉是 ord(c)跟 chr(a)，&lt;br&gt;
前者字元轉數字，後者數字轉字元)&lt;/p&gt;
&lt;p&gt;「(Java)&lt;strong&gt;j++&lt;/strong&gt; 和**++j** 有什麼不同？」&lt;br&gt;
(++本身是代表將這個值增加1，&lt;br&gt;
而擺在變數後面代表&lt;strong&gt;這整行執行完畢以後，才進行遞增&lt;/strong&gt; ；&lt;br&gt;
後者則代表&lt;strong&gt;先將自己本身增加1以後，才執行這整行的操作&lt;/strong&gt; )&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item></channel></rss>