外观数列

Posted xbc121

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了外观数列相关的知识,希望对你有一定的参考价值。

外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:

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 项。

注意:整数序列中的每一项将表示为一个字符串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-and-say
解题思路:要得到第n行的字符串,要先得到第n-1行的字符串。通过遍历第n-1行的字符串,得到每个字符出现的次数count和该字符ch,那么第n行的新字符串就由count和ch构成。如果直接递归,必然超时。因此,可以通过在同一个函数中从第一行或第二行的字符串开始用循环推导出余下行的字符串即可。

1.我的代码:

class Solution {
    public String countAndSay(int n) {
        if(n==1){
            return "1";
        }
        else if(n==2){
            return "11";
        }
        else{
            String str="11";
            for(int i=2;i<n;i++){
                StringBuilder sb=new StringBuilder();
                for(int j=0;j<str.length();j++){
                    char ch1=str.charAt(j);
                    int count=1;
                    for(int k=j+1;k<str.length();k++){
                        char ch2=str.charAt(k);
                        if(ch1==ch2){
                            count++;
                            j=k;
                        }
                        else {
                            break;
                        }
                    }
                    sb.append(count).append(ch1);
                }
                str=sb.toString();
            }
            return str;
        }
    }
}
2.题解代码:

public String countAndSay(int n) {
String str = "1";
for (int i = 2; i <= n; i++) {
StringBuilder builder = new StringBuilder();
char pre = str.charAt(0);
int count = 1;
for (int j = 1; j < str.length(); j++) {
char c = str.charAt(j);
if (c == pre) {
count++;
} else {
builder.append(count).append(pre);
pre = c;
count = 1;
}
}
builder.append(count).append(pre);
str = builder.toString();
}

return str;
}

作者:pphdsny
链接:https://leetcode-cn.com/problems/count-and-say/solution/38-bao-shu-java-xun-huan-by-pphdsny/
来源:力扣(LeetCode)

我的代码和题解代码的差别在于,多了一个for循环。但其实这一for循环是没有必要增加的。

以上是关于外观数列的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:178.外观数列

LC 外观数列

题目地址(38. 外观数列)

算法leetcode|38. 外观数列(多语言实现)

leetcode38 外观数列(Easy)

每日一题篇 — leetcode38号题之外观数列