题目大意:一个count-and-say序列是一个整数的序列,前面的定义如下,给定一个整数n,输出第n个序列。
1,11,21,1211,111221,312211。。。
如何构造这个序列的:
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
.
题目说得很不清楚,做完提交出错,发现题意完全理解错误,后面再网上找了说明才理解了。
这里详细说明下:
第一项即n=1时,序列为1。
第二项时n=2时,因为前一项序列为“1”,此时计数读法为1个1,即表示为“11”。
第三项时n=3时,因为前一项序列为“11”,此时计数读法为2个1,即表示为“21”。
第四项时n=4时,因为前一项序列为“21”,此时计数读法为1个2和1个1,即表示为“1211”。
第五项时n=5时,因为前一项序列为“1211”,此时计数读法为1个1,1个2和2个1,即表示为“111221”。
第六项时n=6时,因为前一项序列为“111221”,此时计数读法为3个1,2个2和1个1,即表示为“312211”。
后面依次类推。
思路:对于n,直接从第一项开始,依次求每一项的表示字符,直到等于n。
下面是ac的代码,时间0ms:
class Solution {
public:
string countAndSay(int n) {
int m=n;
string pre;
pre="1";
for(int i=2;i<=n;++i)
{
string now;
for(int j=0;j<pre.length();++j)
{
int coun=1;
while(j+1<pre.length()&&pre[j]==pre[j+1]){++coun;++j;}
if(coun>0)
{
now+=(char)(coun+'0');
now+=(char)(pre[j]);
}
}
pre=now;
}
return pre;
}
};