美文网首页程序员
【算法】LeetCode算法题-Count And Say

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

作者: 程序员小川 | 来源:发表于2018-10-27 15:30 被阅读0次

这是悦乐书的第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 小结

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

相关文章

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

    这是悦乐书的第153次更新,第155篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第...

  • Count and Say

    标签: C++ 算法 LeetCode 字符串 递归 每日算法——leetcode系列 问题 Count and...

  • 回溯,贪心,动态规划

    1.回溯算法思想leetcode 112 号算法题:路径总和leetcode 113 号算法题:路径总和 IIle...

  • 2018-11-08

    leetcode 38.Count and Say The count-and-say sequence is t...

  • Android面经| 算法题解

    整理了校招面试算法题,部分《剑指offer》算法题,以及LeetCode算法题,本博文中算法题均使用Java实现校...

  • ARTS第三周(2018-12-16)

    1.Algorithm:每周至少做一个 leetcode 的算法题 第一道算法题:https://leetcode...

  • LeetCode算法题-Count Binary Substri

    这是悦乐书的第293次更新,第311篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第...

  • 2019-03-31

    本周学习简单总结 请一定在今天完成LeetCode全部算法题目 Leetcode算法题: 树: 递归:https:...

  • LeetCode Top 100 高频算法题 07:11. Co

    LeetCode Top 100高频算法题,即LeetCode上最高频的100道求职面试算法题。小编和实验室同学之...

  • ARTS(09)

    什么是 ARTS? 算法(Algorithm): 每周至少一道 LeetCode 算法题,加强编程训练和算法学习 ...

网友评论

    本文标题:【算法】LeetCode算法题-Count And Say

    本文链接:https://www.haomeiwen.com/subject/shedtqtx.html