「力扣」第 38 题:外观数列(递归)

67 阅读1分钟

这题首先需要读懂题意,其实代码也不是很好写,我参考了很多很多代码,然后修改成现在这个样子。

这题看一下,把代码写对就好,不用深入研究。

参考代码

public class Solution {

    public String countAndSay(int n) {
        if (n == 1) {
            return "1";
        }

        // 加上一个结束标记,可以理解为「哨兵」,可以避免很多讨论
        String preStr = countAndSay(n - 1) + "#";
        char[] charArray = preStr.toCharArray();
        int len = preStr.length();

        StringBuilder stringBuilder = new StringBuilder();
        int duplicateTimes = 1;
        // 每一次看后一个数,如果一样,就累积
        for (int i = 0; i < len - 1; i++) {
            if (charArray[i] == charArray[i + 1]) {
                duplicateTimes++;
            } else {
                // 根据规则:先数字,后字符
                stringBuilder.append(duplicateTimes);
                stringBuilder.append(charArray[i]);
                // 下一轮 duplicateTimes 重新计算
                duplicateTimes = 1;
            }
        }
        return stringBuilder.toString();
    }
}

说明:递归终止条件隐含在 for 循环里。