[LeetCode]--38. Count and Say

简介: The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 21, 1211, 111221, …1 is read off as “one 1” or 11. 11 is read off as “two 1s” or 21. 21 is read off

The count-and-say sequence is the sequence of integers beginning as follows:
1, 11, 21, 1211, 111221, …

1 is read off as “one 1” or 11.
11 is read off as “two 1s” or 21.
21 is read off as “one 2, then one 1” or 1211.
Given an integer n, generate the nth sequence.

Note: The sequence of integers will be represented as a string.

这个题目理解起来真是太难了,尤其是英文又不好,只能参看下别人的资料,理解下规则。终于理解,题意是n=1时输出字符串1;n=2时,数上次字符串中的数值个数,因为上次字符串有1个1,所以输出11;n=3时,由于上次字符是11,有2个1,所以输出21;n=4时,由于上次字符串是21,有1个2和1个1,所以输出1211。依次类推,写个countAndSay(n)函数返回字符串。

public String countAndSay(int n) {
        if (n == 1) {
            return "1";
        }
        // 递归调用,然后对字符串处理
        String str = countAndSay(n - 1) + "*";// 为了str末尾的标记,方便循环读数
        char[] c = str.toCharArray();
        int count = 1;
        String s = "";
        for (int i = 0; i < c.length - 1; i++) {
            if (c[i] == c[i + 1]) {
                count++;// 计数增加
            } else {
                s = s + count + c[i];// 上面的*标记这里方便统一处理
                count = 1;// 初始化
            }
        }
        return s;
    }

还有一种非递归的算法。这种我感觉比递归算法写起来就困难一些,理解起来其实差不多,双层循环。

public String countAndSay2(int n) {
            String oldString = "1";
            while (--n > 0) {
                StringBuilder sb = new StringBuilder();
                char [] oldChars = oldString.toCharArray();

                for (int i = 0; i < oldChars.length; i++) {
                    int count = 1;
                    while ((i+1) < oldChars.length && oldChars[i] == oldChars[i+1]) {
                        count++;
                        i++;
                    }
                    sb.append(String.valueOf(count) + String.valueOf(oldChars[i]));
                }
                oldString = sb.toString();
            }

            return oldString;
        }
目录
相关文章
LeetCode 357. Count Numbers with Unique Digits
给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n 。
90 0
LeetCode 357. Count Numbers with Unique Digits
|
存储 Python
LeetCode 315. Count of Smaller Numbers After Self
给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。
97 0
LeetCode 315. Count of Smaller Numbers After Self
LeetCode 222. Count Complete Tree Nodes
给出一个完全二叉树,求出该树的节点个数。
91 0
LeetCode 222. Count Complete Tree Nodes
|
测试技术
LeetCode 204. Count Primes
统计所有小于非负整数 n 的质数的数量。
50 0
LeetCode 204. Count Primes
LeetCode contest 200 5475. 统计好三元组 Count Good Triplets
LeetCode contest 200 5475. 统计好三元组 Count Good Triplets
LeetCode 5340. 统计有序矩阵中的负数 Count Negative Numbers in a Sorted Matrix
LeetCode 5340. 统计有序矩阵中的负数 Count Negative Numbers in a Sorted Matrix
LeetCode之Count and Say
LeetCode之Count and Say
99 0
LeetCode 204 Count Primes(质数计数)(*)
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50617645 翻译 计算小于一个非负整数n的质数的个数。
842 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行