🔤 U4 字串・知識點 K13

字串統計與轉換

統計字元、比較字元,並把字元轉換成新的內容

B4-02-StringProcess
練習平台
點標題可以展開或收合

1學習目標

  • 會逐字元走訪字串,統計符合條件的字元有幾個。
  • 會用「或」一次檢查多個目標字元。
  • 會比較相鄰的兩個字元。
  • 會用「旗標」變數記錄「有沒有發生過某件事」。

2概念說明

K12 學會了逐字元走訪,這個知識點把以前學過的技巧搬到字串上:

以前學過搬到字串上
K08 條件計數數字串裡有幾個 a
K04 用「或」組合條件字元是 a、e、i、o、u 其中一個
K11 相鄰比較第 i 個字元和第 i+1 個字元一樣嗎?

骨架都是同一個:

計數 設為 0
i 從 1 數到 字串的長度:
    如果 第 i 個字元 符合條件:
        計數 設為 計數 + 1
說出 計數
💡 旗標:只想知道「有沒有」的時候

有些題目不問「有幾個」,只問「有沒有」。這時可以準備一個變數當作旗標,先設為 NO;走訪時只要發現一次,就把它改成 YES。走完之後,旗標是 YES 就代表至少發生過一次。

3示範題:跟著一步一步做(1 題)

先讀題,再一步一步點開來看。建議每看完一步,就先自己在平台上試著寫寫看。

示範題

計算指定字元數量

L2|進階STR01-004
給定一個字串與目標字元 C,請計算 C 在字串中出現幾次。
輸入
第一行輸入字串 S。第二行輸入一個字元 C。S 不包含空白。
輸出
輸出一個整數,代表 C 出現的次數。
範例1
輸入
banana
a
輸出
3
第 1 步:讀題,找出輸入和輸出
  • 輸入:第一行是字串 S,第二行是一個字元 C。
  • 輸出:C 在 S 裡出現幾次。
第 2 步:把問題拆成步驟
詢問並等待 → 字串
詢問並等待 → C
計數 設為 0
i 從 1 數到 字串的長度:
    如果 字串的第 i 個字元 = C:
        計數 設為 計數 + 1
說出 計數
第 3 步:用範例走一次

字串「banana」、C = a:

i第 i 個字元等於 a?計數
1b否0
2a是1
3n否1
4a是2
5n否2
6a是3

輸出 3。

第 4 步:對照範例答案

按「載入範例」,這就是 K08「條件計數」的骨架,只是資料從「一串數字」換成「字串裡的字元」。

⚠️ 常見錯誤
  • 大小寫不同:「A」和「a」是不同的字元,題目的字串如果有大寫,要看清楚題目要不要分大小寫。

4練習題(2 題)

照順序完成這些題目。寫完之後,可以在平台上按「載入範例」和自己的寫法比較。

母音數量

L2|進階STR01-006
這題多了什麼:條件變成「第 i 個字元是 a 或 e 或 i 或 o 或 u」。Blockly 的「或」積木可以按齒輪增加格子;Scratch 則要把好幾個「或」積木套在一起。
看題目內容
給定一個只包含小寫英文字母的字串,請計算母音 a、e、i、o、u 共出現幾次。
輸入
輸入一個只包含小寫英文字母的字串 S。
輸出
輸出一個整數,代表母音總數。
範例1
輸入
education
輸出
5
💡 需要提示嗎?
逐字元走訪字串,這個字元只要是 a、e、i、o、u 其中之一就加 1,想想要用「且」還是「或」。

相鄰相同字元

L2|進階STR01-008
這題多了什麼:用旗標:「結果」先設為 NO;讓 i 從 1 數到「長度 − 1」,只要第 i 個字元等於第 i+1 個字元,就把結果改成 YES。迴圈只跑到長度 − 1 的原因,和 K11 一樣。
看題目內容
給定一個字串,請判斷是否存在兩個相鄰且相同的字元。
輸入
輸入一個字串 S。S 不包含空白,且長度至少為 1。
輸出
若存在相鄰相同字元,輸出 YES;否則輸出 NO。
範例1
輸入
book
輸出
YES
💡 需要提示嗎?
比較第 i 個和第 i+1 個字元,迴圈只跑到「長度-1」。

5延伸挑戰(3 題)

核心題都會了嗎?這些題目需要把好幾個技巧組合起來,想挑戰的話可以試試看。

🚀 是否回文 L3|挑戰
挑戰重點:回文就是頭尾對稱:第 1 個和最後 1 個一樣、第 2 個和倒數第 2 個一樣……第 i 個要和第(長度 − i + 1)個比較,只要有一組不一樣就不是回文。另一個想法是:用 K12 的方法把字串反轉,再看反轉後和原本是不是一樣。
給定一個不含空白的字串,請判斷它是否正著讀和反著讀都相同。
輸入
輸入一個字串 S。S 不包含空白。
輸出
若 S 是回文,輸出 YES;否則輸出 NO。
範例1
輸入
level
輸出
YES
💡 需要提示嗎?
把第 1 個和最後 1 個字元比較、第 2 個和倒數第 2 個比較……只要有一組不同,就不是回文。
🚀 簡易密碼轉換 L3|挑戰
挑戰重點:先準備密碼環「abcdefghijklmnopqrstuvwxyz」,對每個字元:找出它在密碼環裡的位置,往後移 2 個;如果超過 26,就減 26 回到開頭(y → a、z → b)。再用新位置從密碼環取出新字元,接到結果後面。
小明設計了一種簡單的密碼環密碼規則:將每個字母向後移二個字母(z 變 b)。 密碼環:abcdefghijklmnopqrstuvwxyz 請寫一個程式,輸入一個英文單字,輸出轉換後的字串。 這樣的練習訓練你字元處理與條件轉換。
範例1
輸入
banana
輸出
dcpcpc
範例2
輸入
student
輸出
uvwfgpv
💡 需要提示嗎?
先找出字元在密碼環中的位置,往後移 2 個;超過 z 的時候要從 a 繼續算。
🚀 檢查碼 L3|挑戰
挑戰重點:卡號第 1 個字元是英文字母,要先換成對應的數字(A→11、B→13、C→15、D→17);第 2~6 個字元是數字,把它們全部加起來,最後看總和除以 5 的餘數是不是 4。注意:從字串取出來的「2」是文字,Blockly 要先寫成「字元 − 0」轉成數字再相加,否則會被接成一串文字;Scratch 的「+」會自動轉換。
書店會員卡享有購書8折優惠,為避免有人偽造會員卡,書店老闆在卡號中加入檢查碼。 會員卡編號格式為:一個英文字母 + 4個數字 + 1個檢查碼。 英文字母對應的數字如下: A → 11 B → 13 C → 15 D → 17 若為正確的會員卡號,則 (英文字母對應的數字 + 4個數字 + 檢查碼) 除以 5 的餘數會是 4,其餘情況皆為不正確。 例如: B20135 = 13+2+0+1+3+5 = 24 → 24÷5=4餘4 → 正確會員卡 A15274 = 11+1+5+2+7+4 = 30 → 30÷5=6餘0 → 不正確會員卡 請寫一個程式判斷會員卡號是否正確,若正確輸出 yes,否則輸出 no。
範例1
輸入
C20351
輸出
no
範例2
輸入
D15713
輸出
yes
💡 需要提示嗎?
先把英文字母換成對應的數字,再把其他每一位數字加起來,最後看除以 5 的餘數是不是 4。

6自我檢核

學完之後,檢查看看你能不能做到這些事。有做不到的,就回到上面對應的地方再看一次。

  • 我會逐字元走訪字串,數出符合條件的字元有幾個。
  • 我會用「或」一次檢查好幾個目標字元。
  • 我會比較字串中相鄰的兩個字元。
  • 我會用旗標記錄「有沒有發生過」。