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框架,经过深度定制与匠心打造的商协会系统,被誉为商协会领域数字化运营管理的新锐之星。它以“智慧化会员体系、智敏化内容运营、智能化活动构建”为三大核心动力源,…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
