6.5 模擬專題:LeetCode 38. 外觀數列

1. 題目鏈接

LeetCode 38. 外觀數列


2. 題目描述

給定一個正整數 n,生成外觀數列的第 n 項。外觀數列的定義如下:

  • 1 項為 "1"
  • n 項是對第 n-1 項的描述。例如,第 2 項描述第 1 項("1")為 "11"(即“1個1”),第 3 項描述第 2 項("11")為 "21"(即“2個1”),依次類推。

示例

  • 輸入:n = 4 → 輸出:"1211"
  • 輸入:n = 5 → 輸出:"111221"

3. 示例分析
  1. 基礎案例

    • n=1"1"
    • n=2"11"
    • n=3"21"
    • n=4"1211"(描述 "21" 為“1個2,1個1”)
    • n=5"111221"(描述 "1211" 為“1個1,1個2,2個1”)
  2. 復雜案例

    • n=6"312211"(描述 "111221" 為“3個1,2個2,1個1”)

4. 算法思路

核心思想迭代生成 + 雙指針統計

  1. 初始化:從第 1"1" 開始迭代。
  2. 迭代生成:對當前項從左到右掃描,統計連續相同字符的數量。
  3. 雙指針統計
    • left 指針標記當前字符的起始位置。
    • right 指針向右移動,直到遇到不同字符。
    • 統計長度 right - left,拼接成新字符串的 "數量+字符"
  4. 循環遞推:重復上述過程 n-1 次,生成第 n 項。

時間復雜度

  • 外層循環 n-1 次,內層遍歷字符串長度,總時間復雜度為 O(n·m),其中 m 為字符串的平均長度。

5. 邊界條件與注意事項
  1. 輸入范圍
    • n ≥ 1,需處理 n=1 直接返回 "1"
  2. 字符串拼接優化
    • 使用 string+= 操作拼接字符,避免頻繁創建新對象。
  3. 指針越界檢查
    • 內層循環需確保 leftright 不超過字符串長度。
  4. 大數問題
    • n 較大時(如 n=30),生成的字符串長度可能超過 1e5,需注意內存限制。

6. 代碼實現
class Solution {
public:string countAndSay(int n) {string ret = "1";for (int i = 1; i < n; i++) { // 迭代生成前n-1項string tmp; // 臨時存儲當前項的下一項描述int len = ret.size();for (int left = 0, right = 0; right < len;) {// 移動right指針,統計連續相同字符的數量while (right < len && ret[right] == ret[left]) right++;// 拼接"數量+字符"tmp += to_string(right - left) + ret[left];left = right; // 更新left指針到下一個字符的起始位置}ret = tmp; // 更新當前項}return ret;}
};

在這里插入圖片描述


關鍵代碼解析

  1. 外層循環控制迭代次數

    for (int i = 1; i < n; i++)
    
    • 從第 1 項開始,生成到第 n 項需要迭代 n-1 次。
  2. 雙指針統計連續字符

    while (right < len && ret[right] == ret[left]) right++;
    
    • right 指針右移,直到遇到不同字符或越界。此時 right - left 即為連續字符的數量。
  3. 拼接描述字符串

    tmp += to_string(right - left) + ret[left];
    
    • 將數量轉換為字符串,并與當前字符拼接。例如,連續 2'1' 拼接為 "21"
  4. 更新指針位置

    left = right;
    
    • left 移動到下一個待統計字符的起始位置。

與其他解法的對比

方法時間復雜度空間復雜度核心思想
遞歸法O(n·m)O(n·m)遞歸生成前一項,再描述
迭代法O(n·m)O(m)雙指針遍歷,直接構造
動態規劃法O(n·m)O(m)存儲中間結果,避免重復計算

總結

迭代法通過雙指針高效統計連續字符,避免了遞歸的棧空間開銷,是本題的最優解。其核心在于 逐層遞推雙指針滑動窗口,以線性時間復雜度生成外觀數列。

適用場景

  • 需要快速生成較大 n 值的結果(如 n ≤ 30)。
  • 內存敏感場景,避免遞歸棧溢出。

關鍵點

  • 理解雙指針在統計連續字符中的應用。
  • 掌握字符串拼接的優化技巧。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73755.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73755.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73755.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是具身智能

具身智能&#xff08;Embodied Intelligence&#xff09;是人工智能與機器人學交叉的前沿領域&#xff0c;強調智能體通過身體與環境的動態交互實現自主學習和進化&#xff0c;其核心在于將感知、行動與認知深度融合?。通俗地講&#xff0c;就是機器人或者智能系統在物理環境中…

git命令使用小記(打補丁)

需求&#xff1a;需要從開發分支提取本人提交代碼&#xff0c;然后合并到主分支 一、制作補丁包 mkdir -p patches for commit in $(git log commitA..commitB --author"username" --reverse --prettyformat:"%h"); do …

mapbox基礎,加載popup彈出窗

????? 主頁: gis分享者 ????? 感謝各位大佬 點贊?? 收藏? 留言?? 加關注?! ????? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、??前言1.1 ??mapboxgl.Map 地圖對象1.2 ??mapboxgl.Map style屬性1.3 ??popup 彈出窗 api1.3.1 ??構造函數1.…

C++11--(1)

目錄 1.列表初始化 {}初始化 C98中 C11中 內置置類型和自定義類型 創建對象也適用 std::initializer_list 2.變量類型推導 auto C98 C11 decltype nullptr 3.范圍for循環 4.STL中一些變化 array 1.創建和初始化 2.訪問元素 ?編輯 3.修改操作 4.支持迭代器…

Promise的狀態和方法是什么?

Promise 的狀態和方法 1. Promise 的狀態 一個 Promise 可以處于以下三種狀態之一&#xff1a; - Pending&#xff08;待定&#xff09;&#xff1a;初始狀態&#xff0c;表示異步操作正在進行中&#xff0c;Promise 還沒有被解決或拒絕。 - Fulfilled&#xff08;已完成&…

Windows云服務器支持哪些數據庫管理系統?

Windows云服務器因其良好的兼容性和企業級支持&#xff0c;廣泛用于網站托管、企業管理系統、金融應用、數據分析等場景。在這些應用中&#xff0c;數據庫管理系統(DBMS)起著至關重要的作用。Windows 服務器支持多種數據庫&#xff0c;包括關系型數據庫(SQL)和非關系型數據庫(N…

MongoDB 實際工作中應用場景

博主介紹&#xff1a;?全網粉絲5W&#xff0c;全棧開發工程師&#xff0c;從事多年軟件開發&#xff0c;在大廠呆過。持有軟件中級、六級等證書。可提供微服務項目搭建與畢業項目實戰&#xff0c;博主也曾寫過優秀論文&#xff0c;查重率極低&#xff0c;在這方面有豐富的經驗…

03 相機標定圖像采集

學完本文,您將獲取一下技能: 1:如何提升標定質量,如選擇標定板,標定圖像采集的注意事項, 2:實現標定圖像自動篩選的代碼 3:量產場景如何通過一張圖像來標定相機 為了實現良好的標定效果,以下因素在標定數據采集前必須設置得當。 標定板選擇 標定板尺寸準確材料平…

GitHub美化個人主頁3D圖表顯示配置操作

這個功能主要是用的這個開源倉庫&#xff1a;https://github.com/yoshi389111/github-profile-3d-contrib 想看效果的話&#xff0c;我的個人主頁&#xff1a;https://github.com/Sjj1024 開始操作 1.創建自己的github主頁屬性項目——跟你github用戶名一致即可&#xff0c;…

buu-jarvisoj_fm-好久不見52

格式化字符串漏洞題 x等于4x等于4???????x等于4???????x等于4 可以知道是第11個參數&#xff0c;%11$ 定位到這個位置&#xff0c;然后%n往這個位置寫入4 1.先用pwndbg調試得到偏移量 2.查看獲取x的地址 3.構造ROP鏈&#xff0c;發送連接 from pwn import *# …

AwesomeQt分享3(含源碼)

AwesomeQt 這個項目包含了多個Qt組件的使用示例&#xff0c;旨在展示Qt各種強大功能的實現方式。 源碼分享 github: awesome_Qtgitee: 后續同步 項目進度 QCustomPlot曲線控件示例 支持排序和篩選的列表控件示例 支持排序和篩選的表格控件示例 屬性表示例 Dock窗口示例 自繪…

ubuntu 安裝 g++

文章目錄 前提一、安裝 g1.1 安裝1.2 驗證 前提 安裝 tflite_support 報錯 error: subprocess-exited-with-error RuntimeError: Unsupported compiler -- at least C11 support is needed!一、安裝 g 1.1 安裝 # 安裝編譯工具鏈&#xff08;如g&#xff09;和依賴庫 sudo …

【NLP 50、損失函數 KL散度】

目錄 一、定義與公式 1.核心定義 2.數學公式 3.KL散度與交叉熵的關系 二、使用場景 1.生成模型與變分推斷 2.知識蒸餾 3.模型評估與優化 4.信息論與編碼優化 三、原理與特性 1.信息論視角 ?2.優化目標 3.?局限性 四、代碼示例 代碼運行流程 核心代碼解析 抵達夢想靠的不是狂熱…

使用QT畫帶有透明效果的圖

分辨率&#xff1a;24X24 最大圓 代碼: #include <QApplication> #include <QImage> #include <QPainter>int main(int argc, char *argv[]) {QImage image(QSize(24,24),QImage::Format_ARGB32);image.fill(QColor(0,0,0,0));QPainter paint(&image);…

【Unity網絡編程知識】使用Socket實現簡單TCP通訊

1、Socket的常用屬性和方法 創建Socket TCP流套接字 Socket socketTcp new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 1.1 常用屬性 1&#xff09;套接字的連接狀態 socketTcp.Connected 2&#xff09;獲取套接字的類型 socketTcp.So…

青少年編程與數學 02-013 初中數學知識點 02課題、概要

青少年編程與數學 02-013 初中數學知識點 02課題、概要 一、數與代數二、圖形與幾何三、統計與概率四、綜合與實踐五、課程理念與目標 根據2022年版義務教育數學課程標準&#xff0c;初中數學知識點可以總結為以下四大領域。 一、數與代數 數與式 有理數與實數&#xff1a;理解…

深入探索 libarchive

深入探索 libarchive&#xff1a;跨平臺歸檔處理的終極解決方案 一、背景與歷史沿革 1.1 歸檔處理的演進之路 從1979年tar格式的誕生到現代云存儲時代&#xff0c;歸檔技術經歷了四個關鍵階段&#xff1a; Unix時代&#xff1a;tar/cpio主導系統備份互聯網黎明期&#xff1…

2025最新“科研創新與智能化轉型“暨AI智能體開發與大語言模型的本地化部署、優化技術實踐

第一章、智能體(Agent)入門 1、智能體&#xff08;Agent&#xff09;概述&#xff08;什么是智能體&#xff1f;智能體的類型和應用場景、典型的智能體應用&#xff0c;如&#xff1a;Google Data Science Agent等&#xff09; 2、智能體&#xff08;Agent&#xff09;與大語…

Yolo_v8的安裝測試

前言 如何安裝Python版本的Yolo&#xff0c;有一段時間不用了&#xff0c;Yolo的版本也在不斷地發展&#xff0c;所以重新安裝了運行了一下&#xff0c;記錄了下來&#xff0c;供參考。 一、搭建環境 1.1、創建Pycharm工程 首先創建好一個空白的工程&#xff0c;如下圖&…

時尚界正在試圖用AI,創造更多沖擊力

數字藝術正以深度融合的方式&#xff0c;在時尚、游戲、影視等行業實現跨界合作&#xff0c;催生了多樣化的商業模式&#xff0c;為創作者和品牌帶來更多機會&#xff0c;數字藝術更是突破了傳統藝術的限制&#xff0c;以趣味觸達用戶&#xff0c;尤其吸引了年輕一代的消費群體…