题目描述
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例 1:
输入: s = "3[a]2[bc]"
输出: "aaabcbc"
示例 2:
输入: s = "3[a2[c]]"
输出: "accaccacc"
示例 3:
输入: s = "2[abc]3[cd]ef"
输出: "abcabccdcdcdef"
示例 4:
输入: s = "abc3[cd]xyz"
输出: "abccdcdcdxyz"
isNaN() 函数
检查值是否为 NaN:
isNaN(123) //false
isNaN(-1.23) //false
isNaN(5-2) //false
isNaN(0) //false
isNaN('123') //false
isNaN('Hello') //true
isNaN('2005/12/12') //true
isNaN('') //false
isNaN(true) //false
isNaN(undefined) //true
isNaN('NaN') //true
isNaN(NaN) //true
isNaN(0 / 0) //true
isNaN(null) //false
定义和用法
isNaN() 函数可确定值是否为非数字(Not-a-Number)。
如果该值等于 NaN,则此函数返回 true。否则返回 false。
此函数不同于 Number 特定的 Number.isNaN() 方法。
全局 isNaN() 函数将测试值转换为数字,然后对其进行测试。
Number.isNaN() 不会将值转换为数字,并且不会为任何非数字类型的值返回 true。
repeat() 方法
复制字符串 "Runoob" 两次:
var str = "Runoob";
str.repeat(2);
定义和用法
repeat() 方法字符串复制指定次数。
解题思路
- 由题可知,需要将中括号内的字符复制多次,并输出
- 可以设置一个numStack数字栈,strStack字符栈
- 循环输入的字符,判断当前遇到的字符,根据字符进行处理
代码
var decodeString = function(s) {
let numStack = []; // 数字栈
let strStack = []; // 字符栈
let num = 0; // 数字数量
let result = ''; // 返回的字符
for (const char of s) {
if(!isNaN(char)) {
// 累加数字
num = num * 10 + Number(char);
} else if(char == '[') { // 遇到左中括号
// 把当前字符压入字符栈中
strStack.push(result);
result = '';
// 把当前的num压入numStrack栈中
numStack.push(num);
num = 0;
} else if(char == ']') {
// 取出当前numStack数字栈中的栈顶元素
let temp = numStack.pop();
result = strStack.pop() + result.repeat(temp);
} else {
result += char;
}
}
return result;
}
代码执行过程
- 输入s = '3[a]2[bc]';
- 循环开始,第一个值是3,存入第一个if内,num = 3;
- 第二个值是'[',左中括号,进入第二个if,字符栈中存入result结果,然后把result清空,把num存入numStrack栈中,清空num。
- 第三个值是字母,进入最下面的else内,存入result中
- 第四个值是']',有中括号,进入第三个if内,把数字栈顶的元素弹出,然后拼接result会等于,字符栈的栈顶元素,加上当前的result复制temp次。