學習軌道
/
Pharo
Pharo
/
練習
/
反轉字串
反轉字串

反轉字串

簡單

簡介

反轉字串(從右往左讀,而不是從左往右讀)在程式設計中是出乎意料常見的工作。

舉例來說,在生物資訊領域裡,反轉 DNA 或 RNA 字串的序列,對各種分析來說往往很重要,例如找出互補股,或是辨識具有生物學意義的迴文序列。

說明

你的任務是反轉一個給定的字串。

幾個例子:

  • 把"stressed"變成"desserts"。
  • 把"strops"變成"sports"。
  • 把"racecar"變成"racecar"。

雖然字串已經有#reversed和#reverseDo:方法,但你能不能用更底層的字元疊代和串流,自己想辦法完成呢?

為了方便你瀏覽程式碼,Pharo 提供了一個好用的程式碼搜尋工具。按下 Shift-Enter 就能啟用。

注意:我們依循 Exercism 的慣例,把解法命名為 ReverseString,不過更貼近 Smalltalk 風格的名字會是 StringReverser。

Smalltalk 與字串

談到字串,有些顯而易見的小細節,例如用雙引號寫註解、用單引號寫字串,以及字元的特殊語法(例如用 $x 表示字元「x」),第一次讀到的時候可能會讓你感到困惑,因為這些慣例和其他語言採用的不一樣。

另外還有符號的概念:符號是一種在整個記憶體中獨一無二的字串。也就是說,當它被建構時(通常是在編譯期),會先在記憶體中搜尋是否已經有相同的符號;如果有的話,就只會沿用原本那一個。這麼做的理由不只是節省記憶體,更因為比較符號時能大幅提升速度。

"this is a comment"
'this is a string'
#'this is a symbol'
#thisIsASymbolToo

Smalltalk 程式裡的逗號也非常少,因為逗號在語法上不扮演任何角色。 這就是為什麼陣列字面值不需要逗號,例如 #(1 2 3 4 5) 不過,逗號本身也是個運算子,當你串接兩個字串時就會看到它;例如 'string1', 'string2'

最後,值得一提的是,字串和字元是不同的類別。字串是字元的集合。在疊代字串時,這點可能會讓你措手不及,因為你可能會不小心把字元傳進預期收到字串的方法。請看……

(('hello' at: 2) = $e) inspect.
(('hello' at: 2) = 'e') inspect.

Smalltalk 與串流

串流適合用來依序讀取和寫入。它們讓程式碼更簡潔,因為不必再自己遞增索引。 串流可以操作任何集合。

stream := WriteStream on: String new.
stream nextPut: $h ; nextPutAll: 'ell' ; nextPut: $o.
stream contents inspect
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Pharo Exercism

準備好開始 反轉字串 了嗎?

註冊 Exercism,透過 50 個練習 和真人引導來學習並精通 Pharo,全部免費。

深入探索 反轉字串!

探索 14 種反轉字串的不同方法,涵蓋 Unicode 碼點、字素、堆疊與堆積的記憶體配置,以及指標等主題。放鬆一下,跟著 Jeremy 和 Erik 一起享受 45 分鐘的學習時光。