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基本语法小白入门级

    Java基本语法小白入门级

    Java基本语法就是指java中的规则,也是一种语言规则,规范,同时也能让您在后面的学习中避免不必要的一些错误和麻烦,是您学好java必修的第一门课程
    2023-05-05
  • Spring Cloud Gateway 整合 knife4j 聚合接口文档功能

    Spring Cloud Gateway 整合 knife4j 聚合接口文档功能

    这篇文章主要介绍了Spring Cloud Gateway 整合 knife4j 聚合接口文档的相关知识,我们可以基于 Spring Cloud Gateway 网关 + nacos + knife4j 对所有微服务项目的接口文档进行聚合,从而实现我们想要的文档管理功能,需要的朋友可以参考下
    2022-02-02
  • MyBatis注解实现动态SQL问题

    MyBatis注解实现动态SQL问题

    这篇文章主要介绍了MyBatis注解实现动态SQL问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 深入剖析理解AsyncGetCallTrace源码底层原理

    深入剖析理解AsyncGetCallTrace源码底层原理

    这篇文章主要为大家介绍了AsyncGetCallTrace源码的深层原理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • Java集合类中文介绍

    Java集合类中文介绍

    本文首先对Java集合类框架做了简单说明,之后对主要类和为API做了介绍:Collection、List、Set、AbstractCollection、AbstractList、AbstractSet、Iterator、ListIterator。
    2013-11-11
  • springboot整合多数据源配置方式

    springboot整合多数据源配置方式

    这篇文章主要介绍了springboot整合多数据源配置,多数据源整合springboot+mybatis使用分包方式整合,springboot+druid+mybatisplus使用注解整合,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-12-12
  • 详解Spring 中 Bean 的生命周期

    详解Spring 中 Bean 的生命周期

    这篇文章主要介绍了Spring 中 Bean 的生命周期的相关资料,帮助大家更好的理解和使用spring框架,感兴趣的朋友可以了解下。
    2021-01-01
  • SpringCloud配置服务端的ConfigServer设置安全认证

    SpringCloud配置服务端的ConfigServer设置安全认证

    这篇文章主要为大家介绍了SpringCloud配置服务端的ConfigServer设置安全认证,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • mybatis-plus之如何实现in嵌套sql

    mybatis-plus之如何实现in嵌套sql

    这篇文章主要介绍了mybatis-plus之如何实现in嵌套sql问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java Fluent Mybatis 项目工程化与常规操作详解流程篇 上

    Java Fluent Mybatis 项目工程化与常规操作详解流程篇 上

    Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。国内又以Mybatis用的多,基于mybatis上的增强框架,又有mybatis plus和TK mybatis等。今天我们介绍一个新的mybatis增强框架 fluent mybatis
    2021-10-10

最新评论