有梦想,有干货,微信搜索【大千世界】关注这位凌晨还在洗碗的洗碗小智。本文已收录到GitHubhttps://github.com/qq449245884/xiaozhi,里面有完整的测试站点、资料和我的一线厂商访谈系列文章。在解释这道题之前,我们先来看下一个数据结构:栈,因为我们需要用到栈来解决这道题。栈(stack),又称堆栈,是一种操作受限的线性表,只能在表尾进行插入和删除操作。这一端称为栈顶,另一端称为栈底。向栈中插入新元素也称为压入、压入或压入;从堆栈中删除元素也称为入栈或出栈。后进先出(LIFO)特点:在栈中的元素中,最先进的一定是最后出栈的,最后入栈的必须先出栈。在JavaScript中,堆栈可以用数组来模拟。有必要限制使用push()和pop(),而不是unshift()和shift()。也就是说,数组的末尾是堆栈的顶部。当然可以使用面向对象的方法来更好的封装栈。面试题这是来自今日头条和滴滴的面试题。题目如下:尝试编写“智能重复”smartRepeat函数,并实现:将3[abc]变为abcabcabc将3[2[a]2[b]]变为对于aabbaabbaabb,将2[1[a]变为3[b]2[3[c]4[d]]]intoabbbcccddddcccddddabbbcccddddcccdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddcisnotvalid,forexample:2[a3[b]]iswrong,youshouldadda1,thatis,2[1[a]3[b]][abc]是错误的,应该加1,即1[abc]看到这道题,应该会想到recursively,其实这道题用recursion是比较难的。也可以做,但是相比stack,stack的方法会简单很多。初学者大坑:栈题目和递归很像。这种题目给人的感觉就是用递归来解决问题。满怀信心地开始写,却发现递归无法递归。这时候就要想到不用递归,而是用栈。我们可以使用两个栈来解决这个问题。第一个栈存储数字,第二个栈存储字符串。这时候我们可以发现只需要遍历一次指针即可。你怎么认为?规则如下:当遍历到一个数时,将该数压入栈中,继续遍历。这时候在遍历到方括号,或者遍历到数字和方括号的时候,再放入一个空字符串''。然后向下移动,遇到3,同样压栈:再向下移动,遇到方括号,按一个空串''再向下移动,遇到字母a,那么遇到字母时有什么规则,如图图中:然后下移遇到]],注意遍历到右花括号结束的时候,是很重要的一次,那么这个规则是什么,如下图:是不是有点看不懂,然后我们再次运行,向下移动到4[,分别按下数字4和一个空字符串:然后向下移动遇到1[,分别按下数字1和一个空字符串:然后向下移动遇到b,推入:然后向下移动,遇到终结符]],分别弹出1和'b',此时,重复'b'后,拼接到栈顶第二个元素然后下移,遇到To2,同样的操作:然后移动向下遇到c,直接写:然后向下移动,遇到结束字符]],分别弹出2和'c',此时一次,重复'c'两次并拼接到第二个栈顶元素再向下移动,遇到倒数第二个终结符]],分别pop4和'bccc',此时重复'bccc'四四次并拼接到第二个栈顶的元素再向下移动,遇到最后一个终结符],分别弹出2和'aaabccbccbccbcc'。这时候重复'aaabccbccbccbcc'两次。这个时候就不需要拼到最后一个元素了,因为已经是最后一个了:这个答案就是我们的最终答案了吗?厉害了~这时候我们在按照上面的过程演示这道题:2[1[a]3[b]2[3[c]4[d]]]变成abbbcccddddcccddddabbbccccddddcccddddddd代码实现创建index.js,输入如下内容://尝试编写“智能重复”smartRepeat函数,实现://将3[abc]改成abcabcabc//改3[2[a]2[b]]intoaabbaabbaabb//Change2[1[a]3[b]2[3[c]4[d]]]intoabbbcccddddcccddddabbbcccddddcccddddddfunctionsmartRepeat(templateStr){//指针varindex=0;//堆栈1,存储编号varstack1=[];//堆栈2,存储临时字符串varstack2=[];//休息varrest=templateStr;while(index
