【题目】
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
1.
2.
3.
4.
5.
1
被读作 "one 1"
("一个一"
) , 即 11
。
11
被读作 "two 1s"
("两个一"
), 即 21
。
21
被读作 "one 2"
, "one 1"
("一个二"
, "一个一"
) , 即 1211
。
给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
示例 1:
输入:
输出: "1"
示例 2:
输入:
输出: "1211"
【思路】
这道题题意可能不太好理解,下一个值是上一个值的报数:第一个值是‘1’,第二个值是第一个值的报数'11'(1个1),第三个值是第二个值的报数'21'(2个1),第四个值是第三个值的报数'1211'(1个2,1个1),以此类推。
因此,本题实现起来不难,注意考虑边界问题。
【代码】
python版本
class Solution(object):
def countAndSay(self, n):
"""
:type n: int
:rtype: str
"""
res = '1'
if n == :
return '1'
for i in range(, n):
count =
tmp = ''
# 统计连续相同字符的个数,加入tmp中
for i in range(, len(res)):
if res[i] == res[i-1]:
count +=
else:
tmp += str(count) + res[i-1]
count =
tmp += str(count) + res[-1]
res = tmp
return res
C++版本
class Solution {
public:
string countAndSay(int n) {
string res="1";
int count=;
string tmp;
for(int i=; i<n; i++){
tmp = "";
count = ;
// 统计连续相同字符的个数,加入tmp中
for(int j=; j<res.size(); j++){
if(res[j] == res[j-1])
count++;
else{
tmp += to_string(count) + res[j-1];
count = ;
}
}
tmp += to_string(count) + res[res.size()-1];
res = tmp;
}
return res;
}
};