网站仿站教程,下载app安装,快手小程序入口,网站托管 建设方案古语有云#xff1a;“事以密成#xff0c;语以泄败”#xff01; 关于字符串解码#xff1a; 题目#xff1a;题解#xff1a;js代码#xff1a;代码中遇到的方法#xff1a;repeat方法#xff1a;为什么这里不用this.strstack.push(result)#xff1f; 题目#x… 古语有云“事以密成语以泄败” 关于字符串解码 题目题解js代码代码中遇到的方法repeat方法为什么这里不用this.strstack.push(result) 题目 题解
假设输入字符串为 s “3[a2[c]]”解码过程如下
初始化变量 numStack一个数组用于存储遇到的数字表示重复次数。 strStack一个数组用于存储待拼接的字符串片段。 num一个变量用于临时存储当前解析到的数字倍数。 result一个字符串用于临时存储当前构建的字符串结果。扫描到 3num 3。扫描到 [将 result “” 推入 strStack将 num 3 推入 numStack然后重置 result “” 和 num 0。扫描到 a追加到 resultresult “a”。扫描到 2num 2。扫描到 [将 result “a” 推入 strStack将 num 2 推入 numStack然后重置 result “” 和 num 0。扫描到 c追加到 resultresult “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函数中并没有这样的上下文改变。