Go Java算法之外观数列实现方法示例详解

 更新时间:2022年08月10日 16:43:00   作者:黄丫丫  
这篇文章主要为大家介绍了Go Java算法外观数列实现的方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

外观数列

给定一个正整数 n ,输出外观数列的第 n 项。

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。

你可以将其视作是由递归公式定义的数字字符串序列:

countAndSay(1) = "1"

countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。

前五项如下:

  • 1、1 —— 第一项是数字 1
  • 2、11 —— 描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
  • 3、21 —— 描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
  • 4、1211 —— 描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
  • 5、111221 —— 描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"

方法一:遍历生成(Java)

所谓的「外观数列」,其实本质上只是依次统计字符串中连续相同字符的个数。

题目中给定的递归公式定义的数字字符串序列如下:

countAndSay(1) = "1";

countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。

我们定义字符串 S_{i}表示countAndSay(i),我们如果要求得 S_{n},则我们需先求出 S_{n-1},然后按照上述描述的方法生成,即从左到右依次扫描字符串 S_{n-1}中连续相同的字符的最大数目,然后将字符的统计数目转化为数字字符串再连接上对应的字符。

class Solution {
    public String countAndSay(int n) {
        String str = "1";
        for (int i = 2; i <= n; ++i) {
            StringBuilder sb = new StringBuilder();
            int start = 0;
            int pos = 0;
            while (pos < str.length()) {
                while (pos < str.length() && str.charAt(pos) == str.charAt(start)) {
                    pos++;
                }
                sb.append(Integer.toString(pos - start)).append(str.charAt(start));
                start = pos;
            }
            str = sb.toString();
        }
        return str;
    }
}

N 为给定的正整数,M 为生成的字符串中的最大长度

时间复杂度:O(N * M)

空间复杂度:O(M)

方法二:递归(Go)

具体的方法分析已经在上文中表述

由于每次得到的数据都是来源于上一次的结果,所以我们可以假设得到了上次的结果,继而往后运算。这就运用到了递归。

func countAndSay(n int) string {
    if n == 1 {
        return "1"
    }
    s := countAndSay(n - 1)
    i, res := 0, ""
    length := len(s)
    for j := 0; j < length; j++ {
        if s[j] != s[i] {
            res += strconv.Itoa(j-i) + string(s[i])
            i = j
        }
    }
    res += strconv.Itoa(length-i) + string(s[i])
    return res
}

N 为给定的正整数,M 为生成的字符串中的最大长度

时间复杂度:O(N * M)

空间复杂度:O(M)

以上就是Go Java算法之外观数列实现方法示例详解的详细内容,更多关于Go Java算法外观数列的资料请关注脚本之家其它相关文章!

相关文章

  • java 同步器SynchronousQueue详解及实例

    java 同步器SynchronousQueue详解及实例

    这篇文章主要介绍了java 同步器SynchronousQueue详解及实例的相关资料,需要的朋友可以参考下
    2017-05-05
  • Java中final关键字的使用与注意总结

    Java中final关键字的使用与注意总结

    这篇文章主要给大家介绍了关于Java中final关键字的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-08-08
  • Java多线程之线程状态的迁移详解

    Java多线程之线程状态的迁移详解

    线程状态迁移,又常被称作线程的生命周期,指的是线程从创建到终结需要经历哪些状态,什么情况下会出现哪些状态.线程的状态直接关系着并发编程的各种问题,本文就线程的状态迁移做一初步探讨,并总结在何种情况下会出现这些状态,需要的朋友可以参考下
    2021-06-06
  • SpringBoot + Spring Cloud Consul 服务注册和发现详细解析

    SpringBoot + Spring Cloud Consul 服务注册和发现详细解析

    这篇文章主要介绍了SpringBoot + Spring Cloud Consul 服务注册和发现,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Maven依赖junit @Test报错的解决方案

    Maven依赖junit @Test报错的解决方案

    这篇文章主要介绍了Maven依赖junit @Test报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • idea2023创建JavaWeb教程之右键没有Servlet的问题解决

    idea2023创建JavaWeb教程之右键没有Servlet的问题解决

    最近在写一个javaweb项目,但是在IDEA中创建好项目后,在搭建结构的时候创建servlet文件去没有选项,所以这里给大家总结下,这篇文章主要给大家介绍了关于idea2023创建JavaWeb教程之右键没有Servlet问题的解决方法,需要的朋友可以参考下
    2023-10-10
  • SpringMVC的概念以及快速入门示例

    SpringMVC的概念以及快速入门示例

    这篇文章主要介绍了SpringMVC的概念以及快速入门示例,SpringMVC 已经成为目前最主流的MVC框架之一,它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口,需要的朋友可以参考下
    2023-05-05
  • java实时监控文件行尾内容的实现

    java实时监控文件行尾内容的实现

    这篇文章主要介绍了java实时监控文件行尾内容的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • SpringBoot整合Elasticsearch并实现CRUD操作

    SpringBoot整合Elasticsearch并实现CRUD操作

    这篇文章主要介绍了SpringBoot整合Elasticsearch并实现CRUD操作,需要的朋友可以参考下
    2018-03-03
  • Java实现添加文字水印和图片水印功能

    Java实现添加文字水印和图片水印功能

    为图片添加水印是一种常用的图片处理技术,本文主要介绍了Java实现添加文字水印和图片水印功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05

最新评论