算法实战:外观数列与数青蛙
41. 外观数列
题目描述
给定一个正整数 n,返回外观数列的第 n 项。
外观数列是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。例如:
- 第 1 项是 "1"
- 第 2 项是对 "1" 的描述,即 "11"(一个 1)
- 第 3 项是对 "11" 的描述,即 "21"(两个 1)
- 第 4 项是对 "21" 的描述,即 "1211"(一个 2,一个 1)
核心思路
这道题本质上是字符串处理。我们需要遍历当前字符串,统计连续相同字符的出现次数,然后拼接成新的字符串。使用双指针可以高效地完成这一过程:左指针标记当前字符段的起始位置,右指针向后扫描直到遇到不同字符或到达末尾。
C++ 实现
class Solution {
public:
string countAndSay(int n) {
string ret = "1";
while (--n) {
string s;
int left = 0, right = 0, len = 0;
// 双指针遍历当前字符串
while (right < ret.size()) {
if (ret[right] == ret[left]) {
right++;
} else {
len = right - left;
s += to_string(len);
s += ret[left];
left = right;
}
}
// 处理最后一段
len = right - left;
s += to_string(len);
s += ret[left];
ret = s;
}
return ret;
}
};
流程解析
代码中 to_string 将计数转换为字符串拼接。注意循环结束后,还需要处理最后一段连续字符,因为循环条件 right < ret.size() 在遇到不同字符时才会触发写入逻辑,若整个字符串只有一种字符,则需在循环外补全。




