题目

38. 报数

题解


代码

import java.util.*;

public class code38 {

    public static String countAndSay(int n) {
        String res = "1";
        for (int i = 1; i < n; i++) {
            res = next_times(res);
        }
        return res;
    }

    public static String next_times(String res) {
        int i = 0;
        int n = res.length();
        String ans = "";
        while (i < n) {
            int count = 1;
            while ((i < n - 1) && (res.charAt(i) == res.charAt(i + 1))) {
                i++;
                count++;
            }
            ans += (count + "" + res.charAt(i));
            i++;
        }
        return ans;
    }

    // public static String countAndSay(int n) {
    // return countHelper("1", n);
    // }

    // // 尾递归
    // public static String countHelper(String str, int n) {
    // if (n == 1) {
    // return str;
    // } else {
    // // 求下一个数
    // StringBuilder sb = new StringBuilder();
    // int i = 0;
    // // 一直读数
    // while (i < str.length()) {
    // int count = 1;
    // // 如果一直是同一个数
    // while ((i < str.length() - 1) && (str.charAt(i) == str.charAt(i + 1))) {
    // i++;
    // count++;
    // }
    // //下一个数更新
    // sb.append(Integer.toString(count) + str.charAt(i));
    // i++;
    // }
    // str = sb.toString();
    // }
    // return countHelper(str, n - 1);
    // }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            int x = sc.nextInt();
            String str = countAndSay(x);
            System.out.println(str);
        }
    }
}

参考

  1. 直接推(模拟过程)——题解一
  2. Java和C,尾递归,0ms——题解二