38. 外观数列 - 力扣(LeetCode)

基础知识要求:

Java:方法、for循环、if eles语句、StringBuilder类

Python: 方法、for循环、if else语句、字符串拼接

题目: 

「外观数列」是一个数位字符串序列,由递归公式定义:

  • countAndSay(1) = "1"
  • countAndSay(n) 是 countAndSay(n-1) 的行程长度编码。

行程长度编码(RLE)是一种字符串压缩方法,其工作原理是通过将连续相同字符(重复两次或更多次)替换为字符重复次数(运行长度)和字符的串联。例如,要压缩字符串 "3322251" ,我们将 "33" 用 "23" 替换,将 "222" 用 "32" 替换,将 "5" 用 "15" 替换并将 "1" 用 "11" 替换。因此压缩后字符串变为 "23321511"

给定一个整数 n ,返回 外观数列 的第 n 个元素。

示例 1:

输入:n = 4

输出:"1211"

解释:

countAndSay(1) = "1"

countAndSay(2) = "1" 的行程长度编码 = "11"

countAndSay(3) = "11" 的行程长度编码 = "21"

countAndSay(4) = "21" 的行程长度编码 = "1211"

示例 2:

输入:n = 1

输出:"1"

解释:

这是基本情况。

提示:

  • 1 <= n <= 30

思路解析:

  1. 理解问题
    • 首先,理解外观数列的定义。它从一个单独的字符 "1" 开始,后续每一项都是对前一项的行程长度编码(RLE)。
    • 行程长度编码(RLE)是将连续的相同字符替换为它们出现的次数和该字符的串联。
  2. 初始化
    • 对于基本情况,即 n = 1,直接返回字符串 "1"。
    • 对于其他情况,我们需要一个循环来迭代地从 n = 2 构建到 n
  3. 迭代构建
    • 在循环中,我们需要两个变量:一个是 prev(存储前一项的外观数列),初始化为 "1";另一个是 curr(存储当前项的外观数列),初始化为空字符串。
    • 还需要一个变量 count 来跟踪 prev 中连续相同字符的数量,初始化为 1。
    • 遍历 prev 字符串,每次迭代时检查当前字符与前一个字符是否相同。如果相同,count 加 1;如果不同,将 count 和前一个字符添加到 curr 中,并重置 count 为 1。
    • 在遍历完 prev 后,别忘了处理最后一个字符的计数,因为循环中可能没有捕获到它。
    • 最后,将 curr 设置为新的 prev,以便下一次迭代。
  4. 返回结果
    • 当循环结束时,prev 将包含外观数列的第 n 个元素。
    • 返回 prev 即可。
  5. 编写代码
    • 根据上述思路,编写代码实现外观数列的生成。

这样,我们就可以通过迭代的方式构建出外观数列,并返回第 n 个元素。

Java代码示例:

public class CountAndSay {  public String countAndSay(int n) {  if (n == 1) {  return "1";  }  String prev = "1"; // 外观数列的前一项  for (int i = 2; i <= n; i++) {  StringBuilder curr = new StringBuilder(); // 当前项,使用StringBuilder更高效  int count = 1; // 连续字符的计数  // 遍历前一项字符串  for (int j = 1; j < prev.length(); j++) {  if (prev.charAt(j) == prev.charAt(j - 1)) {  count++; // 连续字符,计数加1  } else {  // 字符不连续,将前一个字符的计数和字符本身添加到当前项中  curr.append(count).append(prev.charAt(j - 1));  count = 1; // 重置计数  }  }  // 处理最后一个字符的计数  curr.append(count).append(prev.charAt(prev.length() - 1));  // 更新前一项为当前项  prev = curr.toString();  }  // 返回外观数列的第n个元素  return prev;  }  public static void main(String[] args) {  CountAndSay solution = new CountAndSay();  System.out.println(solution.countAndSay(4)); // 输出: 1211  System.out.println(solution.countAndSay(1)); // 输出: 1  }  
}

Python代码示例:

def countAndSay(n: int) -> str:  if n == 1:  return "1"  prev = "1"  # 初始化prev为外观数列的第一个元素  for i in range(2, n + 1):  curr = ""  # 用于构建当前外观数列元素的字符串  count = 1  # 初始化计数为1,用于计算连续字符的数量  # 遍历prev字符串,统计连续字符的数量并构建curr字符串  for j in range(1, len(prev)):  if prev[j] == prev[j - 1]:  count += 1  else:  curr += str(count) + prev[j - 1]  # 将前一个字符的计数和字符本身添加到curr中  count = 1  # 重置计数  # 处理最后一个字符的计数  curr += str(count) + prev[-1]  # 更新prev为curr,以便下一次迭代  prev = curr  return prev  # 示例  
print(countAndSay(4))  # 输出: "1211"  
print(countAndSay(1))  # 输出: "1"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录Python低代码开发框架zdppy_amcrud的开发过程

实现新增接口 基础代码 import env import mcrud import api import snowflakeenv.load(".env") db mcrud.new_env()table "user" columns ["name", "age"]async def add_user(req):data await api.req.get_json(req)values [d…

SkyEye对接CANoe:助力汽车软件功能验证

01.简介 CANoe&#xff08;CAN open environment&#xff09;是德国Vector公司专为汽车总线设计而开发的一款通用开发环境&#xff0c;作为车载网络和ECU开发、测试和分析的专业工具&#xff0c;支持从需求分析到系统实现的整个系统的开发过程。CANoe丰富的功能和配置选项被OE…

虚拟ECU:彻底改变汽车软件开发与测试

汽车开发领域有着垂直性较强的一系列需求&#xff0c;其中最为瞩目的需求之一就是对安全高效的软件测试方法的需求。传统的汽车开发偏向使用硬件原型与真实ECU进行软件测试&#xff0c;但由于硬件设备往往在开发周期的中后阶段才生产完成&#xff0c;给汽车开发带来了成本与时间…

理解Solidity 中的 tx.origin 和 msg.sender

开发者需要了解在Solidity中tx.origin和msg.sender的区别。这两个全局变量经常被混淆&#xff0c;尽管它们之间有着根本的不同。虽然乍一看它们可能相似&#xff0c;但在交易的上下文中&#xff0c;tx.origin和msg.sender代表不同的地址。在这篇博客文章中&#xff0c;我们将深…

spring boot 之 事务

内容是小老弟的一些整理和个人思考总结&#xff0c;知识的海洋那么大&#xff0c;有错误的话还请诸位大佬指点一下&#xff01; 事务是一个不可分割操作序列&#xff0c;也是数据库并发控制的基本单位&#xff0c;其执行的结果必须使数据库从一种一致性状态变到另一种一致性状…

电商内卷时代,视频号小店凭借一己之力“脱颖而出”

大家好&#xff0c;我是电商笨笨熊 今年618各大电商平台花样百出&#xff1b; 某宝更是直接取消了“预售”&#xff0c;从5月就开始进入618预热期&#xff1b; 不少玩家既开心又难过&#xff0c;市场如此内卷&#xff0c;618确实是个爆发期&#xff0c;但更多的需要不断压低…

Star CCM+分配零部件至区域后交界面丢失-更新找回

前言 在工程应用中&#xff0c;将零部件分配至区域后&#xff0c;一般常规的操作需要对交界面进行检查。偶尔会发现交界面丢失。遇到此类问题&#xff0c;在没有做其他操作前&#xff08;比如画网格&#xff09;&#xff0c;可以选择先删除所有区域在重新分配至区域。若已经进…

基于SSM的大学生兼职管理系统

基于SSM的大学生兼职管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 企业界面 前台学生界面 管理员界面 摘要 随着大学生兼职市场的日益繁…

K8s 高级调度

文章目录 K8s 高级调度CronJobinitContainerTaint 和 Toleration污点&#xff08;Taint&#xff09;容忍&#xff08;Toleration&#xff09; AffinityNodeAffinityPodAnffinity 和 PodAntiAffinity 总结 K8s 高级调度 CronJob 在 k8s 中周期性运行计划任务&#xff0c;与 li…

【vue echart】完成一个简单echart图表+自适应

实现效果&#xff1a; html&#xff1a; <divref"echartOne"id"echartOne"style"width: 100%; height: 100%" ></div> js: getEchartOne() {let chart this.$echarts.init(this.$refs.echartOne);chart.setOption({title: {text:…

linux 有名管道FIFO

无名管道应用的一个重大限制是它没有名字&#xff0c;因此&#xff0c;只能用于具有亲缘关系的进程间通信&#xff0c;在有名管道&#xff08;named pipe或FIFO&#xff09;提出后&#xff0c;该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联&#xff0c;以…

云原生|为什么服务网格能够轻松重塑微服务?一文讲清楚!

目录 一、概述 二、 设计 三、服务网格 四、总结 一、概述 容器化技术与容器编排推动了微服务架构应用的演进&#xff0c;于是应用的扩展与微服务的数量日益增加&#xff0c;新的问题随之而来&#xff0c;监控服务的性能变得越来越困难&#xff0c;微服务与微服务之间相互通…

v-rep--lua接口和c++接口的关联

我们在coppeliasim中调用的lua脚本函数sim.xxxxx()的执行规律有两种情况&#xff1a; 1&#xff0c;要么就是在coppliasim的sim.lua中有这个lua函数的定义&#xff0c;直接执行这个lua函数即可。比如&#xff0c;sim.creatPath(); 2&#xff0c;要么就是这个lua接口没有lua语…

Kafka-集群管理者(Controller)选举机制、任期(epoch)机制

Kafka概述 Kafka-集群管理者&#xff08;Controller&#xff09;选举机制 Kafka中的Controller是Kafka集群中的一个特殊角色&#xff0c;负责对整个集群进行管理和协调。Controller的主要职责包括分区分配、副本管理、Leader选举等。当当前的Controller节点失效或需要进行重新…

嵌入式实时操作系统笔记1:RTOS入门_理解简单的OS系统

今日开始学习嵌入式实时操作系统RTOS&#xff1a;UCOS-III实时操作系统 本次目标是入门RTOS&#xff0c;理解多任务系统...... 本文只是个人学习笔记&#xff0c;基本都是对网上资料的整合...... 目录 STM32裸机与RTOS区别&#xff1a; 裸机中断示例&#xff1a; RTOS对优先级…

汽车标定技术(二十一)--英飞凌TC3xx的OLDA怎么玩?(2)

目录 1.概述 2.Vector提出的OLDA概念 2.1 RAM Copy 2.2 Data Trace 3.小结 1.概述 上一篇汽车标定技术(二十一)--英飞凌TC3xx的OLDA怎么玩?(1)-CSDN博客,我们讲了TC3xx

Spring MVC/Web

1.Spring MVC 的介绍 Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;也是Spring框架的一部分。它提供了灵活可扩展的MVC架构&#xff0c;方便开发者构建高性能的Web应用程序&#xff0c;并与 Spring 生态系统无缝集成。 2.MVC 设计模式 MVC&#xff08;Model…

设计模式—23种设计模式重点 表格梳理

设计模式的核心在于提供了相关的问题的解决方案&#xff0c;使得人们可以更加简单方便的复用成功的设计和体系结构。 按照设计模式的目的可以分为三大类。创建型模式与对象的创建有关&#xff1b;结构型模式处理类或对象的组合&#xff1b;行为型模式对类或对象怎样交互和怎样…

CSS实现图片浮动在底层 div 之上,而不会影响底层 div 的布局和内容

前言&#xff1a;遇到个需求&#xff0c;需要图片显示在div之上&#xff0c;但是不占用div的空间布局&#xff0c;网上的答案五花八门&#xff0c;但其实使用css就可以简单实现&#xff0c;仅以此博客作为记录 举个栗子 <div class"container"><img src&qu…

Linux 网络编程基础——网络模型

网络模型 网络模型1. OSI七层模型1. 物理层&#xff08;Physical Layer&#xff09;2. 数据链路层&#xff08;Data Link Layer&#xff09;3. 网络层&#xff08;Network Layer&#xff09;4. 传输层&#xff08;Transport Layer&#xff09;5. 会话层&#xff08;Session Lay…