Leetcode38. 外观数列

这篇具有很好参考价值的文章主要介绍了Leetcode38. 外观数列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、题目描述:

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

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

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

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

前五项如下:

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

要 描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。

  1. 示例 1:

    • 输入:n = 1
    • 输出:“1”
    • 解释:这是一个基本样例。
  2. 示例 2:文章来源地址https://www.toymoban.com/news/detail-425332.html

    • 输入:n = 4
    • 输出:“1211”
    • 解释:
      • countAndSay(1) = “1”
      • countAndSay(2) = 读 “1” = 一 个 1 = “11”
      • countAndSay(3) = 读 “11” = 二 个 1 = “21”
      • countAndSay(4) = 读 “21” = 一 个 2 + 一 个 1 = “12” + “11” = “1211”
  • 提示:
    • 1 <= n <= 30

二、解决思路和代码

1. 解决思路

  • 分析:可以使用递归的方法求解,也可以使用循环。下面讲一下使用for循环的思路。由于 countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。求 countAndSay(n) 要知道 countAndSay(n-1) 的结果,所以求countAndSay(n)的思路:countAndSay(1) -> countAndSay(2) -> … -> countAndSay(n)。求解第 k 项的思路是:
    • countAndSay(k-1)=res, 借助两个指针:
      • numId:指向当前待描述的数字的索引
      • sameId:为统计当前待描述的数字相同的个数设置的指针 或者是 指向下一个【不同于当前待描述的数字res[numId]】待描述的数字。当遇到res[sameId]=res[numId],sameId指针就向后移一位。
        Leetcode38. 外观数列

2. 代码

class Solution:
    def countAndSay(self, n: int) -> str:
        res = '1'
        start = 2
        while start<=n:
            temp = ''
            numId = sameId = 0
            while sameId<len(res):
                while sameId<len(res) and res[sameId]==res[numId]: sameId+=1
                temp += str(sameId-numId)+res[numId]
                numId = sameId
            res = temp
            start += 1
        return res

到了这里,关于Leetcode38. 外观数列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 某软件的一个模块的需求规格说明书中描述【软件测试题目】

    某软件的一个模块的需求规格说明书中描述 (1)年薪制员工:严重过失,扣年终风险金的4%;过失,扣年终风险金的2% (2)非年薪制员工:严重过失,扣除当月薪资的8%;过失,扣除当月薪资的4% (1)分析原因及结果 原因 c1:年薪制员工 c2:非年薪制员工 c3:过失 c4:严重过失

    2024年02月08日
    浏览(37)
  • 【算法Hot100系列】外观数列

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年01月18日
    浏览(30)
  • 华为真题--数列描述

    /** * ■ 题目描述 * * 【数列描述】 * * 有一个数列a[N] (N=60),从a[0]开始,每一项都是一个数字。数列中a[n+1]都是a[n]的描述。其中a[0]=1。 * * 规则如下: * * a[0]:1 * * a[1]:11(含义:其前一项a[0]=1是1个1,即“11”。表示a[0]从左到右,连续出现了1次“1”) * * a[2]:21(含义:其前一项

    2024年02月13日
    浏览(51)
  • 题目:2185.统计包含给定前缀的字符串

    ​​ 题目来源:         leetcode题目,网址:2185. 统计包含给定前缀的字符串 - 力扣(LeetCode) 解题思路:        遍历判断即可。 解题代码: 总结:         官方题解也是一样的思路。

    2024年02月15日
    浏览(36)
  • C语言题目:阶乘数列求和(函数)

    输入一个正数x和一个正整数n,求下列算式的值。要求定义两个调用函数:fact(n)计算n的阶乘;mypow(x,n)计算x的n次幂(即xn),两个函数的返回值类型是double。       x - x2/2! + x3/3! + ... + (-1)n-1xn/n! ×输出保留4位小数。 x n 数列和 定义 fact 函数 : fact(int n) 函数用于计算一个整数

    2024年04月13日
    浏览(36)
  • LeetCode 面试题 16.17. 连续数列

      给定一个整数数组,找出总和最大的连续数列,并返回总和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 进阶: 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。   点击此处跳转题目。   使用动态

    2024年02月05日
    浏览(24)
  • 1027. 最长等差数列【leetcode】/动态规划

    给你一个整数数组 nums,返回 nums 中最长等差子序列的长度。 回想一下,nums 的子序列是一个列表 nums[i1], nums[i2], …, nums[ik] ,且 0 = i1 i2 … ik = nums.length - 1。并且如果 seq[i+1] - seq[i]( 0 = i seq.length - 1) 的值都相同,那么序列 seq 是等差的。 示例 1 : 输入 :nums = [3,6,9,12] 输出 :

    2024年02月21日
    浏览(29)
  • LeetCode刷题---斐波那契数列模型

    顾得泉: 个人主页 个人专栏: 《Linux操作系统》  《C/C++》  《LeedCode刷题》 键盘敲烂,年薪百万! 题目链接:1137. 第 N 个泰波那契数   泰波那契序列Tn定义如下:         T0=0,T1=1,T2= 1,且在n=0的条件下Tn+3= Tn+Tn+1t+Tn+2         给你整数n,请返回第n个泰波那契数Tn的值

    2024年02月04日
    浏览(42)
  • 【LeetCode】446. 等差数列划分II -- 子序列

    题目链接 我们要知道以某个位置为结尾的子序列的数量,可以通过它的以上一位置的为结尾的子序列的数量得知,也就是说,这是一个dp问题。 dp问题我们需要创建dp表,如果我们单纯使用dp[i]来表示以 i 位置为结尾的子序列的数量是完全不够的。因为我们不知道以 i-1 位置为

    2024年02月14日
    浏览(43)
  • 前端算法题——给定一个整数数组,判断是否存在重复元素。

    题目可以理解为如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false。 这题一看就是 计数问题,题目中“如果存在一值在数组中出现至少两次”这句话就告诉我们记录每一个数字出现的次数就能解决问题了。  我们遍历数组时,

    2024年02月20日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包