当前位置: 首页 > 科技观察

今日头条和滴滴的一道面试题:smartRepeat函数

时间:2023-03-12 19:46:02 科技观察

在解释这道题之前,我们先看下一个数据结构:栈,因为我们需要用到栈来解决这道题。栈(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]]]intoabbbcccddddcccddddabbbcccddddcccddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddis,youshouldadda1,thatis,2[1[a]3[b]][abc]iswrong,youshouldadda1,即1[abc]看到这道题你应该会想到recursively其实这道题用递归是比较难的。也可以做,但是相比stack,stack的方法会简单很多。**新手大坑:**栈的题目和递归很像。这种标题给人的感觉就是用递归来解决问题。满怀信心地开始写,却发现递归无法递归。这时候就要想到不用递归,而是用栈。我们可以使用两个栈来解决这个问题。第一个栈存储数字,第二个栈存储字符串。这时候我们可以发现只需要遍历一次指针即可。你怎么认为?规则是这样的:遍历将数字压入栈中,继续遍历。这时候遍历方括号,或者遍历数字和方括号。然后我们将另一个堆栈放入一个空字符串''。然后向下移动,遇到3,同样压栈:再向下移动,遇到方括号,按一个空串''再向下移动,遇到字母a,那么遇到字母时有什么规则,如图图中:然后下移遇到]],注意遍历到右大括号的时候,是很重要的一次,那么这个规则是什么,如下图:然后下移遇到4[,按分别是数字4和一个空串:然后下移遇到1[,分别按数字1和一个空串:然后下移遇到b,压入:然后下移遇到结束符],1和'b'分别要求弹出。这时重复'b'后,拼接到栈顶的第二个元素,然后向下移动。遇到2时,同样的操作:然后下移,遇到c,直接写:然后下移,遇到终结符],分别pop2和'c',此时重复'c'两次,拼接到栈顶的第二个元素,然后向下移动,遇到倒计时的第二个终结符],分别弹出4和'bccc'。这时重复'bccc'四四次后,拼接到栈顶第二个元素,然后下移。当遇到最后一个终结符]时,分别弹出2和'aaabccbccbccbcc',此时重复两次'aaabccbccbccbcc'。这时候就不需要拼前面的元素了,因为是最后一个:这个答案就是我们的最终答案吗?厉害了~这时候我们正在按照上面的过程演示这道题:2[1[a]3[b]2[3[c]4[d]]]变成abbbcccdddddcccdddddabbbcccddddcccdddddddddddd代码实现创建index.js,输入以下内容://尝试编写“智能重复”smartRepeat函数,实现://change3[abc]intoabcabcabc//change3[2[a]2[b]]intoaabbaabbaabb//change2[1[a]3[b]2[3[c]4[d]]]intoabbbcccddddcccddddabbbcccddddcccdddddfunctionsmartRepeat(templateStr){//pointervarindex=0;//stack1,storenumbersvarstack1=[];//栈2,存储临时字符串varstack2=[];//剩余部分varrest=templateStr;while(index