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.pswp.cn/web/14319.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14319.shtml
英文地址,請注明出處:http://en.pswp.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…