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

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 【算法】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 小结

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

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

可能你还想看:

原文始发于微信公众号( 悦乐书 ):

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 【算法】LeetCode算法题-Count And Say


 上一篇
【算法】LeetCode算法题-Length Of Last Word 【算法】LeetCode算法题-Length Of Last Word
这是悦乐书的第155次更新,第157篇原创 (今天在网易云音乐淘到的,希望你们喜欢) 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第14题(顺位题号是58)。给定一个字符串,包含戴尔字母、小写字母和空格,返回最后一
2021-04-05
下一篇 
【算法】LeetCode算法题-Maximum Subarray 【算法】LeetCode算法题-Maximum Subarray
这是悦乐书的第154次更新,第156篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第13题(顺位题号是53)。给定一个整数数组nums,找出一个最大和,此和是由数组中索引连续的元素组成,至少包含一个元素。例如
2021-04-05