[路飞]_394. 字符串解码

85 阅读2分钟

题目路径

题目描述

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: 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次。