38. 报数

2019-07-11  本文已影响0人  衣锦昼行

报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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),需要维护一个长字符串。

上一篇 下一篇

猜你喜欢

热点阅读