自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

頭條和滴滴的一道面試題:smartRepeat 函數(shù)

開發(fā) 前端
棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表,僅在表尾能進(jìn)行插入和刪除操作。這一端被稱為棧頂,相對地,把另一端稱為棧底。

[[402509]]

在講解這道題之前我們先來看下一個數(shù)據(jù)結(jié)構(gòu):棧,因為我們需要用棧來解決這道題。

棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表,僅在表尾能進(jìn)行插入和刪除操作。這一端被稱為棧頂,相對地,把另一端稱為棧底。

向一個棧插入新元素又稱作進(jìn)棧、入?;驂簵?從一個棧刪除元素又稱作出?;蛲藯?。

后進(jìn)先出(LIFO)特點:棧中的元素,最先進(jìn)棧的必定是最后出棧,后進(jìn)棧的一定會先出棧。

JavaScript中,??梢杂脭?shù)組模擬。需要限制只能使用push()和pop(),不能使用unshift()和shift()。即,數(shù)組尾是棧頂。

當(dāng)然,可以用面向?qū)ο蟮仁侄?,將棧封裝的更好。

面試題

這是頭條和滴滴的一道面試題,題目是這樣的:

試編寫“智能重復(fù)”smartRepeat函數(shù),實現(xiàn):

  • 將 3[abc] 變?yōu)閍bcabcabc
  • 將 3[2[a]2[b]] 變?yōu)?aabbaabbaabb
  • 將 2[1[a]3[b]2[3[c]4[d]]] 變?yōu)閍bbbcccddddcccddddabbbcccddddcccdddd

不用考慮輸入字符串是非法的情況,比如:

2[a3[b]]是錯誤的,應(yīng)該補(bǔ)一個1,即2[1[a]3[b]]

[abc]是錯誤的,應(yīng)該補(bǔ)一個1,即1[abc]

大家一看到這題目,應(yīng)該想到的用遞歸的方式來做,實際上這道題用遞歸是比較難的。也是能做,但相比棧,棧的方式會簡單的多。

**初學(xué)者大坑:**棧的題目和遞歸非常像,這類題目給人的感覺都是用遞歸解題。信心滿滿動手開始寫了,卻發(fā)現(xiàn)遞歸怎么都遞歸不出來。此時就要想到,不是用遞歸,而是用棧。

這道題目我們可以使用兩個棧來解,第一個棧存放數(shù)字,第二個棧存放字符串

這時候可以發(fā)現(xiàn)我們指針只需要遍歷一次就行了,怎么看?

規(guī)則是這樣的子:遍歷到數(shù)字就把數(shù)字壓棧

然后繼續(xù)遍歷,這時遍歷到方括號,或者說是遍歷到數(shù)字和方括號,那么我們就把另一個棧放入一個空字符串 ''。

然后下移,遇到 3,同樣也是壓棧:

然后下移,遇到方括號了,壓入一個空字符串 ''

然后下移,遇到字母 a,那么遇到字母是什么規(guī)則呢,如圖中所示:

然后下移,遇到 ],注意,遍歷到結(jié)束的右大括號的時候,是一個非常重要的時間,那這個規(guī)則又是啥呢,如下圖所示:

然后下移遇到 4[,分別把數(shù)字 4 和 空字符串壓入:

然后下移遇到 1[,分別把數(shù)字 1 和 空字符串壓入:

然后下移遇到 b,壓入:

然后下移,遇到結(jié)束符 ],分別要 1 和 'b' 彈出來,此時在把 'b' 重復(fù)一遍后拼接到第二個棧頂元素

然后下移,遇到 2,同樣的操作:

然后下移遇到 c,直接寫入:

然后下移,遇到結(jié)束符 ],分別把 2 和 'c',彈出,此時在把 'c' 重復(fù)二遍后拼接到第二個棧頂元素

然后下移,遇到倒數(shù)第二個結(jié)束符 ],分別把 4 和 'bccc',彈出,此時在把 'bccc' 重復(fù)四四遍后拼接到第二個棧頂元素

然后下移,遇到最后一個結(jié)束符 ],分別把 2 和 'aaabccbccbccbcc',彈出,此時在把 'aaabccbccbccbcc' 重復(fù)兩遍,這時個就不用拼到上一個元素了,因為已經(jīng)是最后一個了:

這個答案是不是就是我們最后的答案了,神奇吧~

這時個我們在按上面的流程來演示一上這題:

2[1[a]3[b]2[3[c]4[d]]] 變?yōu)閍bbbcccddddcccddddabbbcccddddcccdddd。

代碼實現(xiàn)

創(chuàng)建 index.js,輸入以下內(nèi)容:

  1. // 試編寫“智能重復(fù)”smartRepeat函數(shù),實現(xiàn): 
  2. // 將3[abc]變?yōu)閍bcabcabc 
  3. // 將3[2[a]2[b]]變?yōu)閍abbaabbaabb 
  4. // 將2[1[a]3[b]2[3[c]4[d]]]變?yōu)閍bbbcccddddcccddddabbbcccddddcccdddd 
  5.  
  6. function smartRepeat(templateStr) { 
  7.   // 指針 
  8.   var index = 0; 
  9.   // 棧1,存放數(shù)字 
  10.   var stack1 = []; 
  11.   // 棧2,存放臨時字符串 
  12.   var stack2 = []; 
  13.   // 剩余部分 
  14.   var rest = templateStr; 
  15.  
  16.   while (index < templateStr.length - 1) { 
  17.     // 剩余部分 
  18.     rest = templateStr.substring(index); 
  19.  
  20.     // 看當(dāng)前剩余部分是不是以數(shù)字和[開頭 
  21.     if (/^\d+\[/.test(rest)) { 
  22.       // 得到這個數(shù)字 
  23.       let times = Number(rest.match(/^(\d+)\[/)[1]); 
  24.       // 就把數(shù)字壓棧,把空字符串壓棧 
  25.       stack1.push(times); 
  26.       stack2.push(""); 
  27.       // 讓指針后移,times這個數(shù)字是多少位就后移多少位加1位。 
  28.       // 為什么要加1呢?加的1位是[。 
  29.       index += times.toString().length + 1; 
  30.     } else if (/^\w+\]/.test(rest)) { 
  31.       // 如果這個字符是字母,那么此時就把棧頂這項改為這個字母 
  32.       let word = rest.match(/^(\w+)\]/)[1]; 
  33.       stack2[stack2.length - 1] = word; 
  34.       // 讓指針后移,word這個詞語是多少位就后移多少位 
  35.       index += word.length; 
  36.     } else if (rest[0] == "]") { 
  37.       // 如果這個字符是],那么就①將stack1彈棧,②stack2彈棧,③把字符串棧的新棧頂?shù)脑刂貜?fù)剛剛彈出的那個字符串指定次數(shù)拼接到新棧頂上。 
  38.       let times = stack1.pop(); 
  39.       let word = stack2.pop(); 
  40.       // repeat是ES6的方法,比如'a'.repeat(3)得到'aaa' 
  41.       stack2[stack2.length - 1] += word.repeat(times); 
  42.       index++; 
  43.     } 
  44.  
  45.     console.log(index, stack1, stack2); 
  46.   } 
  47.  
  48.   // while結(jié)束之后,stack1和stack2中肯定還剩余1項。返回棧2中剩下的這一項,重復(fù)棧1中剩下的這1項次數(shù),組成的這個字符串。如果剩的個數(shù)不對,那就是用戶的問題,方括號沒有閉合。 
  49.   return stack2[0].repeat(stack1[0]); 
  50.  
  51. var result = smartRepeat("3[2[3[a]1[b]]4[d]]"); 
  52. console.log(result); 

 ~完,我是小智,我們下期見~

 

責(zé)任編輯:姜華 來源: 大遷世界
相關(guān)推薦

2024-10-11 17:09:27

2011-05-23 11:27:32

面試題面試java

2018-03-06 15:30:47

Java面試題

2009-08-11 10:12:07

C#算法

2023-02-04 18:24:10

SeataJava業(yè)務(wù)

2009-08-11 14:59:57

一道面試題C#算法

2009-08-11 15:09:44

一道面試題C#算法

2017-11-21 12:15:27

數(shù)據(jù)庫面試題SQL

2022-04-08 07:52:17

CSS面試題HTML

2023-08-01 08:10:46

內(nèi)存緩存

2011-06-14 09:12:03

JavaScript

2021-03-16 05:44:26

JVM面試題運(yùn)行時數(shù)據(jù)

2021-10-28 11:40:58

回文鏈表面試題數(shù)據(jù)結(jié)構(gòu)

2022-02-08 18:09:20

JS引擎解析器

2011-03-02 10:58:16

SQL server入門面試題

2015-09-02 14:09:19

面試題程序設(shè)計

2017-03-10 09:33:16

JavaScript類型

2017-09-13 07:15:10

Python讀寫文件函數(shù)

2021-03-27 10:59:45

JavaScript開發(fā)代碼

2021-04-13 08:50:21

JS作用域面試題
點贊
收藏

51CTO技術(shù)棧公眾號