[LeetCode] #38 Count and Say 解題

題目連結

題型解說

這是一題難度為簡單的題目

需要設計一個方法,此方法會傳入一個整數 n,將 n 計數轉換後回傳

一開始看到這一題無法第一時間理解意思

後來找了下中文翻譯後總算了解題目是想要說什麼

範例:

n = 1,直接回傳 1
n = 2,需要回傳 11,因為 n = 1 時是回傳 1,所以用語言說的話就是 1 個 1 => 11
n = 3,需要回傳 21,因為 n = 2 的時候是 2 個 1
n = 4,需要回傳 1211,因為 n = 3 的時候是 1 個 2、1 個 1

解題思路

這題可以直接用遞迴來解,如果 n = 1 或 n = 2 的時候直接回傳答案

如果 n = 3 或以上,則利用一個迴圈和一個計數器來轉換結果

程式碼

Java

class Solution {
    public String countAndSay(int n) {
        if (n == 1) {
            return "1";
        }
        
        if (n == 2) {
            return "11";
        }
        
        String temp = countAndSay(n - 1);
        StringBuilder sb = new StringBuilder();
        
        int count = 1;
        for (int i = 1, len = temp.length(); i < len; i++) {
            // 如果和前一個字元不同的話,就將當前計數結果加入
            if (temp.charAt(i) != temp.charAt(i - 1)) {
                sb.append(count).append(temp.charAt(i - 1));
                count = 1;
            } else {
                count++;
            }
            
            // 邊界處理
            if (i == len - 1) {
                sb.append(count).append(count == 1? temp.charAt(i): temp.charAt(i - 1));
            }
        }
        
        return sb.toString();
    }
}