难度:中等
这道题一上来就感觉要用正则来匹配,看到文章中写的使用栈,递归啥的,感觉都挺麻烦的
const decodeString = function (s) {
// 这个正则只能匹配 3[a]2[bc],3[a2[c]] 就不行了
return s.replace(/(\d+)\[(\w+)\]/g, (a, b, c) => {
// 匹配的 a 就是 3[a] 这种,b 就是第一个括号(\d+)匹配到的数字,c 就是第二个括号(\w+)匹配到的字符串,也就是 a b c 都是按照层级顺序这样往后排的
return c.repeat(b);
});
}
面试官肯定不会就这么容易让你过的,
比如不适用正则呢
比如不使用 String
的 repeat
方法呢
其实还是要揣摩面试官考察你的意图,如果是想考察栈这种数据结构,或者是想考察递归和回溯思想的理解呢?
解法 遍历字符串,遇到number就放到 {type: number, value: x} 然后加上 repeat 中来找到后续闭合的 ] 最后得到这个结构,然后不断递归的计算
解法二 转换成一个数组就好了 for循环,遇到 number 就添加进去,然后继续下一个,遇到 [ / ] 也添加进去 遇到字符串,就一直累加,直到遇到number或者 [ / ],然后累加进去