41. 外观数列
题目链接
题目描述
给定一个正整数 n,返回「外观数列」的第 n 项。

题目示例

解法思路
所谓【外观数列】,核心在于依次统计字符串中连续且相同的字符个数。比如第一项是 "1",第二项就是 "11"(一个 1),第三项是 "21"(两个 1),以此类推。
解决这类问题最直接的方式就是模拟。我们需要遍历当前字符串,用双指针记录相同字符的区间长度,然后拼接成新的字符串。注意迭代次数是 n-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;
}
ret;
}
};







