题目链接:38.外观数列

题解:

嗯,做这种题得有宏观思想,我就是被细小地方搞混乱了!

也是双指针的思想。

题目简述:

给定一个序列1,接下来每一项都是前一项的描述,详细请看官网描述!

题解:

说白了,就是从前一项找到相同的字符的起始位置即可。。

例如:12233344只要能分成12233344四段即可!

具体思路:

借助双指针思想,一个指向该段起点j,一个指向该段最后一个位置的下一个位置k即可。该段的长度就是k - j,该段的字符就是s[j]

即最终为t += to_string(k - j) + s[j]

注意 :使用两个变量来回切换,s指向上一个,t指向当前。以及j = k,来进行动态跳转到下一段位置起点!

关于 to_string():

C++11支持的转换字符串函数,在这里如果不使用这个函数,也可以通过'0' + k - j,但是这样有个缺点,不能超过ASCII码的范围!

AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public:
string countAndSay(int n) {
string s = "1";
for(int i = 0; i < n - 1; i++){
string t;
for(int j = 0; j < s.size();){
int k = j + 1;
while(k < s.size() && s[j] == s[k]) k++;
t += to_string(k - j) + s[j];
j = k;
}
s = t;
}
return s;
}
};