iT邦幫忙

2025 iThome 鐵人賽

DAY 0
0
自我挑戰組

LeetCode 每日一題挑戰系列 第 29

Day 29— Count and Say

  • 分享至 

  • xImage
  •  

題目說明

這題的重點是要產生 Count and Say 序列。
它是一個根據「上一項」描述「數字出現次數」的遞迴序列。

定義如下:

countAndSay(1) = "1"
countAndSay(n) = 對 countAndSay(n - 1) 進行“讀數描述”

也就是說每一項都要用「上一項」來產生。

範例解釋

以 n = 4 為例:

n countAndSay(n) 說明
1 "1" 基礎情況
2 "11" 一個 1 → "11"
3 "21" 兩個 1 → "21"
4 "1211" 一個 2、一個 1 → "1211"
類似「壓縮」的概念

這題其實就是在做 Run-Length Encoding (RLE):
連續的相同數字用「數量 + 數字」表示。

例如:

"3322251" → "23321511"

兩個 3 → "23"

三個 2 → "32"

一個 5 → "15"

一個 1 → "11"

解題思路

這題適合用「迴圈 + 字串處理」來做。

步驟

從基礎 "1" 開始。

每次迴圈產生下一個字串:

用一個 StringBuilder 來建新字串。

從頭開始數相同數字有幾個。

把「數量 + 數字」加進結果中。

重複直到第 n 次。

Java 程式碼
class Solution {
public String countAndSay(int n) {
if (n == 1) return "1";

    String result = "1";
    for (int i = 2; i <= n; i++) {
        StringBuilder sb = new StringBuilder();
        char[] arr = result.toCharArray();
        int count = 1;
        
        for (int j = 1; j < arr.length; j++) {
            if (arr[j] == arr[j - 1]) {
                count++;
            } else {
                sb.append(count).append(arr[j - 1]);
                count = 1;
            }
        }
        sb.append(count).append(arr[arr.length - 1]);
        result = sb.toString();
    }
    return result;
}

}

複雜度分析

時間複雜度:O(n × m),其中 m 為字串長度(每次生成都需掃一遍)

空間複雜度:O(m),因為用 StringBuilder 存暫時結果

心得

這題是「字串處理」與「遞迴關係」的綜合練習。
雖然看起來像是壓縮問題,但重點是 理解前一項如何產生下一項。
https://ithelp.ithome.com.tw/upload/images/20251014/20169537mVsHcwIqj8.pnghttps://ithelp.ithome.com.tw/upload/images/20251014/20169537IvubMcrCT6.pnghttps://ithelp.ithome.com.tw/upload/images/20251014/20169537KswT9MLyxa.png


上一篇
Day 28 —Search Insert Position
下一篇
鐵人賽 Day 30 — 最後一天!心得與收穫
系列文
LeetCode 每日一題挑戰30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言