JavaScript栈数据结构算法-大厂面试题
题目:
试编写"智能重复" smartRepeat函数,实现:
- 将 3[abc] 变为abcabcabc
- 将 3[2[a]2[b]] 变为aabbaabbaabb
- 将2[10[a]3[b]2[1[c]5[d]]] 变为aaaaaaaaaabbbcdddddcdddddaaaaaaaaaabbbcdddddcddddd
- 以此类推......
不用考虑输入字符串是非法的情况,比如:
- 2[a3[b]] 是错误的,应该补应一个1,即2[1[a]3[b]]
- [abc] 是错误的,应该补一个1,即1[abc]
解题思路:
遍历每一个字符
- 利用识别[]结合栈创建层级关系
- 创建两个栈,一个保存数字,一个保存单词
- 如果字符是数字标识,则将数字压入数字栈
- 如果字符是 [ ,则将空字符串压单词栈
- 如果字符是字母,则将单词栈栈顶拼接上这个字母
- 如果字符是 ] ,则数字栈和单词栈都出栈,再整合数字和单词。如果栈中还有元素,将整合的字符串拼接到栈顶,没有则完成执行返回结果
代码实现:
-
个人的思路实现(栈+for循环):
function smartRepeat(templateStr) { let numStack = [] // 存放数字的栈 let strStack = [] // 存放字符串的栈 let isNum = false // 判断上一个字符是否为数字 // 遍历模板字符串的每个字符 for (let i = 0; i < templateStr.length; i++) { let char = templateStr[i] // 每一个字符 // 如果该字符是数字 if (/\d/.test(char)) { if (isNum) { // 判断前一项是否为数字,是的话结合前后项的数字 numStack[numStack.length - 1