古语有云:“事以密成,语以泄败”!
标题:
题解:
假设输入字符串为 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"
复制代码 写法:
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函数中,并没有这样的上下文改变。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|