題目:外觀數列定義:
1
11 (一個 1)
21 (兩個 1)
1211 (一個 2,一個 1)
111221 (一個 1,一個 2,兩個 1)
...
給定 n,返回第 n 項字符串。
對字符串 s,從左到右掃描,統計連續相同字符個數 cnt,輸出 cnt + char。
例:"1211" → 1個1, 1個2, 2個1 → "111221"。
// C++
class Solution {
public:
string countAndSay(int n) {
string cur = "1";
for (int i = 2; i <= n; ++i) {
string nxt;
for (int j = 0; j < cur.size(); ) {
int k = j;
while (k < cur.size() && cur[k] == cur[j]) ++k;
nxt += to_string(k - j);
nxt += cur[j];
j = k;
}
cur = move(nxt);
}
return cur;
}
};
# Python
class Solution:
def countAndSay(self, n: int) -> str:
cur = "1"
for _ in range(n - 1):
nxt = []
i = 0
while i < len(cur):
j = i
while j < len(cur) and cur[j] == cur[i]:
j += 1
nxt.append(str(j - i))
nxt.append(cur[i])
i = j
cur = "".join(nxt)
return cur
// Java
class Solution {
public String countAndSay(int n) {
String cur = "1";
for (int i = 2; i <= n; i++) {
StringBuilder sb = new StringBuilder();
for (int j = 0; j < cur.length(); ) {
int k = j;
while (k < cur.length() && cur.charAt(k) == cur.charAt(j)) k++;
sb.append(k - j).append(cur.charAt(j));
j = k;
}
cur = sb.toString();
}
return cur;
}
}
n=30 時長度 ~44 萬,記憶體可承受。| 指標 | 複雜度 | 說明 |
|---|---|---|
| 時間 | O(Lₙ) | 總掃描量與輸出總長度成正比 |
| 空間 | O(Lₙ) | 存儲當前字符串 |
Count and Say 是字符串模式生成的基礎題。核心邏輯簡單:掃描統計連續字符,輸出計數+字符。面試中關鍵在於代碼簡潔正確、邊界處理(n=1 返回 "1")、效能優化(用 StringBuilder)。此題常作為熱身題,考察基本編碼能力與對字符串操作的熟練度。