【leetcode38】外观数组

一.问题描述


给定一个正整数 n ,输出外观数列的第 n 项。

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

你可以将其视作是由递归公式定义的数字字符串序列:

countAndSay(1) = "1"

countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。

示例 1:

输入:n = 1

输出:"1"

解释:这是一个基本样例。

示例 2:

输入:n = 4

输出:"1211"

解释:

countAndSay(1) = "1"

countAndSay(2) = 读 "1" = 一 个 1 = "11"

countAndSay(3) = 读 "11" = 二 个 1 = "21"

countAndSay(4) = 读 "21" = 一 个 2 + 一 个 1 = "12" + "11" = "1211"

二.示例代码


```java

public static void main(String[] args) {

        String result = countAndSay2(5);

        System.out.println(result);

    }

// 循环

    public static String countAndSay(int n) {

        StringBuilder result = new StringBuilder();

        result.append(1);

        for (int i = 1; i < n; i++) {

            StringBuilder eachNumber = new StringBuilder();

            int start = 0;

            for (int j = 1; j < result.length(); j++) {

                if (result.charAt(j) != result.charAt(start)) {

                    eachNumber.append(j - start).append(result.charAt(start));

                    start = j;

                }

            }

            eachNumber.append(result.length() - start).append(result.charAt(start));

            result = eachNumber;

        }

        return result.toString();

    }

// 递归

    public static String countAndSay2(int n) {

        if (n == 1) {

            return "1";

        }

        String eachNumber = countAndSay2(n - 1);

        StringBuilder result = new StringBuilder();

        int start = 0;

        for (int i = 1; i < eachNumber.length(); i++) {

            if (eachNumber.charAt(i) != eachNumber.charAt(start)) {

                result.append(i - start).append(eachNumber.charAt(start));

                start = i;

            }

        }

        result.append(eachNumber.length() - start).append(eachNumber.charAt(start));

        return result.toString();

    }

```

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容