Question:
The count-and-say sequence is the sequence of integers beginning as follows:
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 sequence.
Note: The sequence of integers will be represented as a string.
思路:题意比较难理解,大致意思就是对上一个序列进行查数:
n=1时,序列为:1;
n=2时,序列为:11;(一个"1")
n=3时,序列为:21;(两个“1”)
n=4时,序列为:1211;(一个“2”,两个“1”)
n=5时,序列为:111221;(一个“1”,一个“2”,两个“1”)
n=6时,序列为:312211;(三个“1”,两个“2”,一个“1”)
这里也可以用迭代,我用的循环;
如果第j个数和第j+1个数相等,则cout计数加一,否则输出cout和第j个数并重新计数。
注意
new_sequence.push_back(cout+'0');
int转string类型,int变量不能直接放到string中,要用一些转换方法,如利用char 和sprintf,sstream流等。
Code:
class Solution {
public:
string countAndSay(int n) {
if(n==0) return "";
if(n==1) return "1";
string sequence = "1";
string new_sequence;
int cout = 1;
for(int i = 1 ;i < n; i++){
for(int j = 0; j < sequence.size();j++){
if(j == sequence.size()-1){
new_sequence.push_back(cout+'0');
new_sequence += sequence[j];
break;
}
else if(sequence[j]==sequence[j+1]){
cout++;
}
else{
new_sequence.push_back(cout+'0');
new_sequence += sequence[j];
cout =1;
}
}
if(!new_sequence.empty()) sequence = new_sequence;
new_sequence.clear();
cout =1;
}
return sequence;
}
};