• 【算法】LeetCode算法题-Count And Say


    这是悦乐书的第153次更新,第155篇原创

    01 看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第12题(顺位题号是38)。count-and-say序列是整数序列,前五个术语如下:

    1. 1

    2. 11

    3. 21

    4. 1211

    5. 111221

    1被读作“一个一”或者11。第二项的值是第一项的读法。

    11被读作“两个一”或者21。第三项的值是第二项的读法。

    21被读作“一个二,两个一”或者1211。第四项的值是第三项的读法。

    给定整数n,其中1≤n≤30,生成count-and-say序列的第n项。整数序列的每个术语将表示为一个字符串。例如:

    输入:1

    输出:“1”

    输入:4

    输出:“1211”

    本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

    02 第一种解法

    第一步,界定n的范围,在1到30之间。

    第二步,处理特殊情况,n为1的时候,可以直接返回字符串1。

    第三步,通过题意,我们知道了n代表的字符串是n-1代表的字符串的读法,即n-1表示的字符串读法就是我们想要的答案。

    第一层循环,从1开始循环,直到不小于n,并且接受内层循环的处理结果当做进入下一次循环的条件。

    第二层循环,对初始值为“1”的previous字符串进行处理。

    第三层循环,顺位判断该字符串每一位字符重复出现的次数,此循环至少会走一次,再将每个字符和其出现的次数拼接成字符串,最后将得到此字符串的读法。

    public String countAndSay(int n) {
        if (n > 30 || n < 0) {
            return "";
        }
        if (n == 1) {
            return "1";
        }
        String previous = "1";
        for (int j = 1; j < n; j++) {
            String str = "";
            for (int i = 0; i < previous.length(); i++) {
                char cc = previous.charAt(i);
                int count = 0;
                while (i < previous.length() && cc == previous.charAt(i)) {
                    count++;
                    i++;
                }
                i--;
                str = str + count + cc;
            }
            previous = str;
        }
        return previous;
    }
    

    03 第二种解法

    第一种解法用了三层循环,其实还可以简化下,变成两层循环,将内层的两个循环变成一个。先将字符串第一个字符作为初始条件放在外面,初始化记数为1,然后开始循环,从字符串索引1开始,判断第0位和第1位字符是否相等,相等count就加1,继续循环,如果不相等,拼接字符串,并将count还原为1,判断对象由第0位字符换成第1位字符,继续循环。

    public String countAndSay2(int n) {
        if (n > 30 || n < 0) {
            return "";
        }
        if (n == 1) {
            return "1";
        }
        String previous = "1";
        for (int j = 1; j < n; j++) {
            String str = "";
            char c = previous.charAt(0);
            int count = 1;
            for (int i = 1; i < previous.length(); i++) {
                char cc = previous.charAt(i);
                if (cc == c) {
                    count++;
                } else {
                    str = str + count + c;
                    count = 1;
                    c = cc;
                }
            }
            str = str + count + c;
            previous = str;
        }
        return previous;
    }
    

    04 小结

    以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

  • 相关阅读:
    3.1 虚拟机执行子系统--类文件结构
    13.分解让复杂问题简单(3)
    中文文本中的关键字提取
    中文分词工具 jieba 和 HanLP
    中文NLP的完整机器处理流程
    IDEA导入Eclipse的Web项目
    【ML-15】主成分分析(PCA)
    【ML-13-4】隐马尔科夫模型HMM--预测问题Viterbi(维特比)算法
    【ML-13-3】隐马尔科夫模型HMM--Baum-Welch(鲍姆-韦尔奇)
    【ML-13-2】隐马尔科夫模型HMM--前向后向算法
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/9861387.html
Copyright © 2020-2023  润新知