LeetCode熱題100- 字符串解碼【JavaScript講解】

古語有云:“事以密成,語以泄敗”!

關于字符串解碼:

  • 題目:
  • 題解:
  • js代碼:
  • 代碼中遇到的方法:
    • repeat方法:
    • 為什么這里不用this.strstack.push(result)?

題目:

在這里插入圖片描述

題解:

假設輸入字符串為 s = “3[a2[c]]”,解碼過程如下:

  1. 初始化變量?:
    numStack:一個數組,用于存儲遇到的數字(表示重復次數)。
    strStack:一個數組,用于存儲待拼接的字符串片段。
    num:一個變量,用于臨時存儲當前解析到的數字(倍數)。
    result:一個字符串,用于臨時存儲當前構建的字符串結果。
  2. 掃描到 3,num = 3。
  3. 掃描到 [,將 result = “” 推入 strStack,將 num = 3 推入 numStack,然后重置 result = “” 和 num = 0。
  4. 掃描到 a,追加到 result,result = “a”。
  5. 掃描到 2,num = 2。
  6. 掃描到 [,將 result = “a” 推入 strStack,將 num = 2 推入 numStack,然后重置 result = “” 和 num = 0。
  7. 掃描到 c,追加到 result,result = “c”。
  8. 掃描到 ],從 numStack 彈出 2,從 strStack 彈出 “a”,構建子串 “ac”.repeat(2) = “acc”,然后 result = “acc”。
  9. 掃描到 ],從 numStack 彈出 3,構建最終字符串 “acc”.repeat(3) = “accaccacc”。
  10. 因此,decodeString(“3[a2[c]]”) 的返回值是 “accaccacc”。

也就是有四條分支, 分別是 如果是數字 、[ 、 ] 、 字符串的情況。

? 1. 處理數字字符?:如果 char 是一個數字(!isNaN(char)),則將其轉換為數字,并累加到 num 上。這里使用了 num = num * 10 + Number(char); 來處理多位數字。
?2. 處理 [ 字符?:如果遇到 [,表示一個重復模式的開始。將當前的 result 字符串推入 strStack,以便稍后在其后追加重復的字符串。將當前的 num(表示重復次數)推入 numStack。重置 result 和 num 為空或零,為處理新的字符串片段和可能的數字做準備。
?3. 處理 ] 字符?:如果遇到 ],表示一個重復模式的結束。從 numStack 彈出重復次數 repeatTimes。從 strStack 彈出之前保存的字符串片段,并將其與當前 result 字符串的 repeatTimes 次重復結果拼接起來,然后存回 result。
?4. 處理普通字符?:如果 char 不是數字、[ 或 ],則將其追加到 result 字符串的末尾。

js代碼:

/*** @param {string} s* @return {string}*/
var decodeString = function(s) {let numStack = [];let strStack = [];let num = 0;let result = "";for(let char of s){if(!isNaN(char)){num = num * 10 + Number(char); }else if(char == '['){strStack.push(result);numStack.push(num);num = 0;result = "";}else if(char == ']'){let reapTime = numStack.pop();result = strStack.pop() + result.repeat(reapTime);}else{result += char;}}return result;};

代碼中遇到的方法:

repeat方法:

在JavaScript中,repeat方法是String對象的一個內置方法,它用于將一個字符串重復指定次數,并返回一個新的字符串。這個方法不會改變原始字符串,而是創建一個新的字符串作為結果。

舉例:

let originalString = "abc";
let repeatedString = originalString.repeat(3);
console.log(repeatedString); // 輸出 "abcabcabc"

寫法:

str.repeat(count)

count:一個整數,表示字符串應該被重復的次數。如果count是0,則返回一個空字符串。如果是負數,會拋出一個RangeError異常。

返回值:
一個包含原始字符串重復count次的新字符串。

注意事項:

  • 如果count是一個小數,它會被自動轉換為整數,小數部分會被舍棄。
  • 如果count是Infinity或者是一個大于Number.MAX_SAFE_INTEGER(即253 - 1)的數,會拋出RangeError,因為JavaScript無法處理這么大的字符串。
  • repeat方法是一個不可變的操作,它不會修改原始字符串,而是返回一個新的字符串。

舉例二:

// 使用repeat方法生成一個由10個"-"組成的字符串(分隔符)
let dashes = "-".repeat(10);
console.log(dashes); // 輸出 "----------"// 使用repeat方法和模板字符串生成一個帶有邊框的文本
let text = "Hello, world!";
let borderedText = `|${text.repeat(3)}|`;
console.log(borderedText); // 輸出 "|Hello, world!Hello, world!Hello, world!|"

為什么這里不用this.strstack.push(result)?

this關鍵字通常用于訪問對象的屬性或方法。然而,decodeString函數代碼中,并沒有使用this來引用任何對象的屬性或方法,而是直接使用了局部變量strStack。因為strStack是在函數內部定義的,作為函數作用域內的一個變量,它不需要通過this來訪問。

這里有幾種情況可能會讓你看到this.strStack這樣的用法:

  • 對象的方法?:如果strStack是某個對象的屬性,并且正在該對象的方法內部訪問它,那么會使用this.strStack。但在代碼中,strStack是一個局部變量,不是對象的屬性。
  • 類的成員變量?:在ES6及更高版本的JavaScript中,如果在一個類的方法內部訪問類的成員變量(即屬性),也會使用this。但在代碼中,并沒有使用類。
  • 閉包或上下文改變?:在某些情況下,可能會看到函數內部的this被用來引用外部上下文(比如,在回調函數或箭頭函數中,this的值可能會根據它是如何被調用的而改變)。但在decodeString函數中,并沒有這樣的上下文改變。

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

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

相關文章

水利工程安全包括哪幾個方面

水利工程安全培訓的內容主要包括以下幾個方面: 基礎知識和技能培訓 : 法律法規 :學習水利工程相關的安全生產法律法規,了解安全生產標準及規范。 事故案例 :通過分析事故案例,了解事故原因和教訓&#x…

淺談新能源汽車充電樁建設問題分析及解決方案

摘要: 在全球倡導低碳減排的大背景下,新能源成為熱門行業在全球范圍內得以開展。汽車尾氣排放會在一定程度上加重溫室效應,并且化石能源的日漸緊缺也迫切對新能源汽車發展提出新要求。現階段的新能源汽車以電力汽車為主,與燃油汽…

05-1基于vs2022的c語言筆記——運算符

目錄 前言 5.運算符和表達式 5-1-1 加減乘除運算符 1.把變量進行加減乘除運算 2.把常量進行加減乘除運算 3.對于比較大的數(往數軸正方向或者負方向),要注意占位符的選取 4.浮點數的加減乘除 5-1-2取余/取模運算符 1.基本規則 2.c語…

ubuntu:換源安裝docker-ce和docker-compose

更新apt源 apt換源:ubuntu:更新阿里云apt源-CSDN博客 安裝docker-ce 1、更新軟件源 sudo apt update2、安裝基本軟件 sudo apt-get install apt-transport-https ca-certificates curl software-properties-common lrzsz -y3、指定使用阿里云鏡像 su…

0—QT ui界面一覽

2025.2.26,感謝gpt4 1.控件盒子 1. Layouts(布局) 布局控件用于組織界面上的控件,確保它們的位置和排列方式合理。 Vertical Layout(垂直布局) :將控件按垂直方向排列。 建議:適…

Apache Doris 索引的全面剖析與使用指南

搞大數據開發的都知道,想要在海量數據里快速查數據,就像在星圖里找一顆特定的星星,賊費勁。不過別慌,數據庫索引就是咱們的 “定位神器”,能讓查詢效率直接起飛!就拿 Apache Doris 這個超火的分析型數據庫來…

docker file中ADD命令的介紹

在 Docker 的世界里,Dockerfile 是一個用于定義鏡像內容和行為的腳本文件。其中,ADD 指令是 Dockerfile 中一個非常重要的命令,用于將文件或目錄從主機文件系統復制到容器的文件系統中。本文將詳細介紹 ADD 指令的作用、使用方式以及一些最佳…

從零到一:如何用阿里云百煉和火山引擎搭建專屬 AI 助手(DeepSeek)?

本文首發:從零到一:如何用阿里云百煉和火山引擎搭建專屬 AI 助手(DeepSeek)? 阿里云百煉和火山引擎都推出了免費的 DeepSeek 模型體驗額度,今天我和大家一起搭建一個本地的專屬 AI 助手。  阿里云百煉為 …

cpp中的繼承

一、繼承概念 在cpp中,封裝、繼承、多態是面向對象的三大特性。這里的繼承就是允許已經存在的類(也就是基類)的基礎上創建新類(派生類或者子類),從而實現代碼的復用。 如上圖所示,Person是基類&…

【QT】QLinearGradient 線性漸變類簡單使用教程

目錄 0.簡介 1)qtDesigner中 2)實際執行 1.功能詳述 3.舉一反三的樣式 0.簡介 QLinearGradient 是 Qt 框架中的一個類,用于定義線性漸變效果(通過樣式表設置)。它可以用來填充形狀、背景或其他圖形元素&#xff0…

前端項目配置 Nginx 全攻略

在前端開發中,項目開發完成后,如何高效、穩定地將其部署到生產環境是至關重要的一步。Nginx 作為一款輕量級、高性能的 Web 服務器和反向代理服務器,憑借其出色的性能和豐富的功能,成為了前端項目部署的首選方案。本文將詳細介紹在…

網絡安全學習-常見web漏洞的滲xxx透以及防護方法

滲XX透測試 弱口令漏洞 漏洞描述 目標網站管理入口(或數據庫等組件的外部連接)使用了容易被猜測的簡單字符口令、或者是默認系統賬號口令。 滲XX透測試 如果不存在驗證碼,則直接使用相對應的弱口令字典使用burpsuite 進行爆破如果存在驗證…

網絡安全 機器學習算法 計算機網絡安全機制

(一)網絡操作系統 安全 網絡操作系統安全是整個網絡系統安全的基礎。操作系統安全機制主要包括訪問控制和隔離控制。 訪問控制系統一般包括主體、客體和安全訪問政策 訪問控制類型: 自主訪問控制強制訪問控制 訪問控制措施: 入…

2025網絡安全等級測評報告,信息安全風險評估報告(Word模板)

一、概述 1.1工作方法 1.2評估依據 1.3評估范圍 1.4評估方法 1.5基本信息 二、資產分析 2.1 信息資產識別概述 2.2 信息資產識別 三、評估說明 3.1無線網絡安全檢查項目評估 3.2無線網絡與系統安全評估 3.3 ip管理與補丁管理 3.4防火墻 四、威脅細類分析 4.1威脅…

Ubuntu22.04系統安裝Anaconda、CUDA和CUDNN

之前一直在Windows系統下使用Anaconda和CUDA加速,最近需要復現一個算法,文檔里面有Linux系統conda構建環境的教程。 本篇博文參考博文,記錄自己安裝的過程,便于以后需要。 目錄 1.Anaconda1.1 安裝包下載1.2 安裝軟件1.3 更新cond…

微信小程序調用火山方舟(字節跳動火山引擎)中的DeepSeek大模型

一、注冊火山引擎賬號,創建API Key和model(接入點ID) 1.注冊并登陸火山引擎賬號,網址為:https://console.volcengine.com/ 2.根據登陸后的頁面提示進行實名認證,實名認證后才能創建API Keyt和創建接入點。…

藍橋杯之日期題

文章目錄 1.藍橋杯必備知識點2. 題型13.需求2 1.藍橋杯必備知識點 藍橋杯是一個面向全國高校計算機相關專業學生的學科競賽,涵蓋多個賽道,常見的有軟件類(如 C/C 程序設計、Java 軟件開發、Python 程序設計)和電子類(…

muduo網絡庫2

Muduo網絡庫:底層實質上為Linux的epoll pthread線程池,且依賴boost庫。 muduo的網絡設計核心為一個線程一個事件循環,有一個main Reactor負載accept連接,然后把連接分發到某個sub Reactor(采用輪詢的方式來選擇sub Reactor)&…

WinSCP 連接到 Ubuntu 虛擬機

要使用 WinSCP 連接到 Ubuntu 虛擬機,一般采用 SFTP 或 SCP 協議進行文件傳輸。以下是詳細步驟: 1. 確保虛擬機網絡可訪問 首先,你的 Ubuntu 虛擬機需要允許外部訪問: 如果使用 NAT 網絡:需要設置端口轉發&#xff0…

redis小記

redis小記 下載redis sudo apt-get install redis-server redis基本命令 ubuntu16下的redis沒有protected-mode屬性,就算sudo啟動,也不能往/var/spool/cron/crontabs寫計劃任務,感覺很安全 #連接到redis redis-cli -h 127.0.0.1 -p 6379 …