9、数列描述——华子机试必知必会

245 阅读1分钟

题目描述

有一个数列A[n],从A[0]开始每一项都是一个数字,数列中A[n+1]都是A[n]的描述,其中A[0]=1,规则如下:

A[0]:1

A[1]:11 含义其中A[0]=1是1个1 即11,表示A[0]从左到右连续出现了1次1

A[2]:21 含义其中A[1]=11是2个1 即21, 表示A[1]从左到右连续出现了2次1

A[3]:1211 含义其中A[2]从左到右是由一个2和一个1组成 即1211,表示A[2]从左到右连续出现了一次2又连续出现了一次1

A[4]:111221 含义A[3]=1211 从左到右是由一个1和一个2两个1 即111221,表示A[3]从左到右连续出现了一次1又连续出现了一次2又连续出现了2次1

输出第n项的结果

0<= n <=59

输入描述

数列第n项 0<= n <=59

输出描述

数列内容

示例1

输入

4

输出

111221 

题解

   public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入数列第n项(0<= n <=59):");
        int n = scanner.nextInt();
        String result = generateNthTerm(n);
        System.out.println(result);
    }

    /**
     * 生成数列的第n项
     * @param n
     * @return
     */
    public static String generateNthTerm(int n) {
        // 首先对输入进行合法性检查
        if (n < 0 || n > 59) {
            throw new IllegalArgumentException("Invalid input. n should be between 0 and 59.");
        }
        String currentTerm = "1";
        for (int i = 1; i <= n; i++) {
            currentTerm = getNextTerm(currentTerm);
        }
        return currentTerm;
    }

    /**
     * 根据当前项生成下一项
     * @param term
     * @return
     */
    private static String getNextTerm(String term) {
        StringBuilder result = new StringBuilder();
        int count = 1;
        char currentDigit = term.charAt(0);
        for (int i = 1; i < term.length(); i++) {
            char nextDigit = term.charAt(i);
            // 如果当前字符与下一个字符相同,则计数加一
            if (nextDigit == currentDigit) {
                count++;
            } else {
                // 如果不同,则将计数和当前字符添加到结果中,并更新当前字符和计数
                result.append(count).append(currentDigit);
                currentDigit = nextDigit;
                count = 1;
            }
        }
        // 将最后一个字符和计数添加到结果中
        result.append(count).append(currentDigit);
        return result.toString();
    }