报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
1. 1 2. 11 3. 21 4. 1211 5. 111221
1
被读作 "one 1"
("一个一"
) , 即 11
。11
被读作 "two 1s"
("两个一"
), 即 21
。21
被读作 "one 2"
, "one 1"
("一个二"
, "一个一"
) , 即 1211
。
给定一个正整数 n ,输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
示例 1:
输入: 1 输出: "1"
示例 2:
输入: 4 输出: "1211"
此题每一轮数字为上一轮报数,将每个数报出。
做题思路,数字N则报n-1项
两层循环,内层循环为字符的长度
记录一个flag=str[j-1]后一项与前一项比较
我们每次只需要判断相等,并且判断是否为最后一位数。
分为在相等情况的最后一位
和不相等情况的最后一位。
代码如下
class Solution {
public:
string countAndSay(int n)
{
if (n == 1)return "1";
if (n == 2)return "11";
if (n ==3 )return "21";
string str = "21";
string temp;
char flag;
int acount = 1;
for (int i = 3; i < n; i++)
{
for (int j = 1; j < str.size(); j++)
{
flag = str[j -1];
if (flag == str[j])
{
if (j == str.size() - 1)
{
acount++;
temp += to_string(acount) + str[j - 1];
break;
}
else
{
acount++;
}
}
else
{
if (j == str.size() - 1)
{
temp += to_string(acount) + str[j - 1];
acount = 1;
temp += to_string(1) + str[j];
break;
}
temp += to_string(acount) + str[j - 1];
acount = 1;
}
}
acount = 1;
str = temp;
temp = "";
}
return str;
}
};