LeetCode热题100- 字符串解码【JavaScript讲解】
古语有云:“事以密成,语以泄败”!
关于字符串解码:
- 题目:
- 题解:
- js代码:
- 代码中遇到的方法:
- repeat方法:
- 为什么这里不用this.strstack.push(result)?
题目:

题解:
假设输入字符串为 s = “3[a2[c]]”,解码过程如下:
- 初始化变量:
numStack:一个数组,用于存储遇到的数字(表示重复次数)。
strStack:一个数组,用于存储待拼接的字符串片段。
num:一个变量,用于临时存储当前解析到的数字(倍数)。
result:一个字符串,用于临时存储当前构建的字符串结果。 - 扫描到 3,num = 3。
- 扫描到 [,将 result = “” 推入 strStack,将 num = 3 推入 numStack,然后重置 result = “” 和 num = 0。
- 扫描到 a,追加到 result,result = “a”。
- 扫描到 2,num = 2。
- 扫描到 [,将 result = “a” 推入 strStack,将 num = 2 推入 numStack,然后重置 result = “” 和 num = 0。
- 扫描到 c,追加到 result,result = “c”。
- 扫描到 ],从 numStack 弹出 2,从 strStack 弹出 “a”,构建子串 “ac”.repeat(2) = “acc”,然后 result = “acc”。
- 扫描到 ],从 numStack 弹出 3,构建最终字符串 “acc”.repeat(3) = “accaccacc”。
- 因此,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函数中,并没有这样的上下文改变。
相关文章:
LeetCode热题100- 字符串解码【JavaScript讲解】
古语有云:“事以密成,语以泄败”! 关于字符串解码: 题目:题解:js代码:代码中遇到的方法:repeat方法:为什么这里不用this.strstack.push(result)? 题目&#x…...
每日一题——LRU缓存机制的C语言实现详解
LRU缓存机制的C语言实现详解 参考1. 数据结构设计双向链表节点哈希表节点哈希表LRU缓存结构 2. 初始化哈希表和双向链表哈希函数初始化哈希表初始化双向链表创建LRU缓存 3. 更新双向链表4. 实现Get操作5. 实现Put操作更新节点值删除最久未使用节点插入或更新节点 6. 释放缓存释…...
Leetcode3162:优质数对的总数 I
题目描述: 给你两个整数数组 nums1 和 nums2,长度分别为 n 和 m。同时给你一个正整数 k。 如果 nums1[i] 可以除尽 nums2[j] * k,则称数对 (i, j) 为 优质数对(0 < i < n - 1, 0 < j < m - 1)。 返回 优…...
docker安装etcd:docker离线安装etcd、docker在线安装etcd、etcd镜像下载、etcd配置详解、etcd常用命令、安装常见问题总结
官方网站 官方网址:etcd 二进制包下载:Install | etcd GitHub社区项目:etcd-io GitHub GitHub社区项目版本历史:Releases etcd-io/etcd GitHub 一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令…...
Apache SeaTunnel 构建实时数据同步管道(最新版)
文章作者 王海林 白鲸开源 数据集成引擎研发 Apache SeaTunnel Committer & PMC Member,Apache SkyWalking Committer,多年平台研发经验,目前专注于数据集成领域。 导读 在当今数字化快速发展的时代,数据已然成为企业决策…...
递归、搜索与回溯第二讲:二叉树中的深搜 穷举vs暴搜vs深搜vs回溯vs剪枝
递归、搜索与回溯第二讲:二叉树中的深搜 && 穷举vs暴搜vs深搜vs回溯vs剪枝 1.计算布尔二叉树的值2.求根节点到叶结点数字之和3.二叉树剪枝4.验证二叉搜索树5.二叉搜索树中第K小的元素6.二叉树的所有路径7.全排列8.子集 1.计算布尔二叉树的值 2.求根节点到叶…...
Hbase分布式——储存机制
说明: 客户端调用,到达zk。然后到大HMaster(主节点可以有多个但是只有和active在一起的才有效。)。然后找到一个HRegionServer(从节点可以有多个)去做保存操作。 每一个HRegionServer上管理着表的HRegion…...
Word表格中如何只单独调整某一单元格宽度
大家好,我是小鱼。 在日常制作Word表格时,表格中不同单元格有时需要设置不同的宽度,但是很多小伙伴会发现想单独调整某一个单元格宽度时,发现其它单元格宽度也会发生变化。那么,到底怎么才能单独调整某一单元格宽度呢…...
Build错误:Cannot determine build data storage root for project 和 无法加载主类的解决办法的经验分享
Build错误:Cannot determine build data storage root for project 解决方案与经验分享 1. 引言 查看错误信息 “Cannot determine build data storage root for project”的含义: 这是一个关于构建项目时遇到的常见错误。错误信息表明构建工具无法确定…...
【Springboot知识】Logback从1.2.x升级到1.3.x需要注意哪些点?
文章目录 **1. 确认依赖版本**示例依赖配置(Maven): **2. 处理 StaticLoggerBinder 的移除**解决方案: **3. 修改日志配置文件**示例 logback.xml 配置: **4. 检查兼容性问题**Spring Boot 2.x 的兼容性解决方案&#…...
大语言加持的闭环端到端自动驾驶模型 学习笔记纯干货
LMDrive:大语言模型辅助闭环端到端 LMDrive:大语言模型辅助闭环端到端 背景框架输入部分:导航指令:视觉数据:提示指令(可选):处理部分:输出部分: 视觉编码器…...
初阶数据结构(C语言实现)——2算法的时间复杂度和空间复杂度
目录 本节目标1. 算法效率1.1 如何衡量一个算法的好坏1.2 算法的复杂度 2.时间复杂度2.1 时间复杂度的概念2.1.1 入门习题2.1.2 进阶习题 2.2 常见时间复杂度 3. 空间复杂度3.1 常见空间复杂度 本节目标 算法效率时间复杂度空间复杂度常见时间复杂度以及复杂度oj练习 1. 算法…...
MySQL知识
1.Navicat客户端连接 打开navicat,点击连接,点击MySQL 输入连接名与密码,如果连接的mysql是windows下的mysql主机号就填写localhost 填写好后点击测试连接 点击确定,mysql连接navicat成功 2.MySQL数据定义语言(DDL) DDL用于数据库…...
【前端定位线上问题的多种方案(不依赖 Sentry)】
前端定位线上问题的多种方案(不依赖 Sentry) 🛠️ 一、构建时注入调试信息 🔧 1. 注入版本信息与 Git 提交哈希 Webpack 配置: // webpack.config.js const webpack require(webpack); const gitRevision require(…...
怎么修改node_modules里的文件,怎么使用patch-package修改node_modules的文件,怎么修改第三方库原文件。
在开发中会遇到需要node_modules里第三方库有bug,然后需要修改node_modules文件的情况 使用patch-package包可以修改node_modules里的文件 patch-package npm 官网:patch-package - npm 安装 npm i patch-package 修改文件后 npx patch-package s…...
muduo网络库2
Muduo网络库:底层实质上为Linux的epoll pthread线程池,且依赖boost库。 muduo的网络设计核心为一个线程一个事件循环,有一个main Reactor负载accept连接,然后把连接分发到某个sub Reactor(采用轮询的方式来选择sub Reactor)&…...
什么是DrawCall?DrawCall为什么会影响游戏运行效率?如何减少DrawCall?
目录 1 什么是DrawCall? 2 DrawCall为什么会影响游戏运行效率? 3 如何减少 DrawCall?(结合性能分析工具) 1 什么是DrawCall? DrawCall(绘制调用) 是 GPU 的一个指令,…...
LabVIEW电能质量分析软件
随着电力系统的复杂性增加,电能质量问题日益突出,传统的电能质量检测装置多采用DSP技术,不仅开发周期长、功能单一,而且在多功能集成方面存在局限性。基于LabVIEW虚拟仪器开发平台的电能质量分析软件利用FFT、STFT、WT、HHT等多种…...
【十二】Golang 映射
💢欢迎来到张胤尘的开源技术站 💥开源如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 映射映射的定义映射初始化make 函数使用字面量 源…...
PHP商协会管理系统小程序源码
📊 商协会管理系统 💻 这是一款基于ThinkPHPUniapp框架,经过深度定制与匠心打造的商协会系统,被誉为商协会领域数字化运营管理的新锐之星。它以“智慧化会员体系、智敏化内容运营、智能化活动构建”为三大核心动力源,…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
