报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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(1 ≤ n ≤ 30),输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
思路:本来以为可以直接将30项直接写出来,写到10多项时发现后面的序列长度非常的长,于是就放弃了,所以可以根据模拟的方法来实现,根据相同数字的个数进行移动计算,比如第五项:111221,从1开始,设置一个num计数器,初始为1,移动计算1连在一起的个数,每增加一个,num+1,连在一起的1有3个则将字符串+num+1,然后依次循环计算.
public String countAndSay(int n) {
if(n==1)
return "1";
String str = "1";
int num=1;
String ans="";
for(int i=1;i<n;i++){
ans="";
for(int j=0;j<str.length();j++){
if(j+1<str.length()&&str.charAt(j+1)==str.charAt(j)){
num++;
}
else {
ans+=String.valueOf(num);
ans+=str.charAt(j);
num=1;
}
}
str=ans;
}
return ans;
}
时间复杂度:O(N*M),N最大是30,所以时间长短主要取决于M的大小,项数越靠后时间复杂度越大。
空间复杂度:O(M),需要维护一个长字符串。
网友评论