问题描述
The count-and-say sequence is the sequence of integers with the first five terms as following:
- 1
- 11
- 21
- 1211
- 111221
1
is read off as "one 1"
or 11
.
11
is read off as "two 1s"
or 21
.
21
is read off as "one 2, then one 1"
or 1211
.
Given an integer
n
, generate the nth term of the count-and-say sequence.
Note: Each term of the sequence of integers will be represented as a string.
题目链接:38. Count and Say
Example 1:
Input: 1
Output: “1”
Example 2:
Input: 4
Output: “1211”
思路分析
很tricky的一道题,一开始没有领会题目的意思,到底这个数字串是怎么数。实际很简单,就是数有几个相同的数字。求下一个序列,从头遍历这个字符串,有多少字符相同就输出”count + string[i]”。要求第
代码
class Solution {
public:
string countAndSay(int n) {
if (n == 0)
return "";
string result = "1";
while (--n){ //very important, when n = 1, directly return result
string cache = "";
for(int i = 0; i < result.length(); i++){
int count = 1;
while(i+1 < result.length() && result[i] == result[i+1]){
count++;
i++;
}
cache = cache + to_string(count) + result[i];
}
result = cache;
}
return result;
}
};
时间复杂度:O(n) //n为nums的元素个数。
反思
一开始看不懂题目,在参考了Discussion后才有这个答案。对于一个问题解决,我需要着重考虑的是边界条件(开始和结束时能否正常工作)、循环判断条件以及循环次数。考虑清楚这些东西之后才可以动手写代码。
在此基础上,有很多小技巧。比如”–n”的使用,可以自动减少一次循环;”i+1 < result.length()”在while循环中判断是否越界;”cache = cache + to_string(count) + result[i];”也可以写作”cache +=to_string(count) + result[i];”。自己还有很多提高的地方啊。