JavaScript算法面試題
前言:
現(xiàn)實(shí)總是殘酷的,最近有個(gè)學(xué)妹在換工作,面試前什么手寫Priomise、vue雙向綁定原理,webpack優(yōu)化方式,準(zhǔn)備了一大堆,本以為成竹在胸,結(jié)果卻在算法上吃了大虧,心儀的offer沒(méi)有拿到,一度懷疑人生。到底是什么算法題能讓面試官對(duì)妹子說(shuō)出你都工作3年了,這個(gè)算法題都不會(huì)?這樣的狠話?
有效的括號(hào)問(wèn)題
這是一道leetcode上的原題,本意是在考察候選人對(duì)
棧
數(shù)據(jù)結(jié)構(gòu)的掌握。來(lái)看看題目
給定一個(gè)只包括 '(',')','{','}','[',']' 的字符串 s ,判斷字符串是否有效。 有效字符串需滿足:
- 左括號(hào)必須用相同類型的右括號(hào)閉合。
- 左括號(hào)必須以正確的順序閉合。
示例:
示例 1: 輸入:s = "()" 輸出:true 示例 2: 輸入:s = "()[]{}" 輸出:true 示例 3: 輸入:s = "(]" 輸出:false 示例 4: 輸入:s = "([)]" 輸出:false 示例 5: 輸入:s = "{[]}" 輸出:true
解題信息
如果咱們確實(shí)沒(méi)有刷過(guò)算法,不知道那么多套路,通過(guò)題目和示例盡可能的獲取到更多的信息就很重要了。
根據(jù)題目推斷出:
- 字符串s的長(zhǎng)度一定是偶數(shù),不可能是奇數(shù)(
一對(duì)對(duì)匹配
)。 右括號(hào)
前面一定跟著左括號(hào)
,才符合匹配條件,具備對(duì)稱性。右括號(hào)
前面如果不是左括號(hào),一定不是有效的括號(hào)。
暴力消除法
得到了以上這些信息后,胖頭魚想既然是
[]
、{}
、()
成對(duì)的出現(xiàn),我能不能把他們都挨個(gè)消除掉,如果最后結(jié)果是空字符串,那不就意味著符合題意了嗎?
舉個(gè)例子:
輸入:s = "{[()]}"
第一步:可以消除()這一對(duì),結(jié)果s還剩{[]}
第二步: 可以消除[]這一對(duì),結(jié)果s還剩{}
第三步: 可以消除{}這一對(duì),結(jié)果s還剩'' 所以符合題意返回true
代碼實(shí)現(xiàn):
const isValid = (s) => { while (true) { let len = s.length // 將字符串按照匹配對(duì),挨個(gè)替換為'' s = s.replace('{}', '').replace('[]', '').replace('()', '') // 有兩種情況s.length會(huì)等于len // 1. s匹配完了,變成了空字符串 // 2. s無(wú)法繼續(xù)匹配,導(dǎo)致其長(zhǎng)度和一開始的len一樣,比如({],一開始len是3,匹配完還是3,說(shuō)明不用繼續(xù)匹配了,結(jié)果就是false if (s.length === len) { return len === 0 } } }
暴力消除法最終還是可以通過(guò)leetcode的用例,就是性能差了點(diǎn),哈哈
棧解題法
解題信息中的第2條強(qiáng)調(diào)對(duì)稱性,而
棧(后入先出)
入棧和出棧恰好是反著來(lái),形成了鮮明的對(duì)稱性。
入棧:abc,出棧:cba
abc
cba
所以可以試試從棧
的角度來(lái)解析:
輸入:s = "{[()]}"
第一步:讀取ch = {,屬于左括號(hào),入棧,此時(shí)棧內(nèi)有{
第二步:讀取ch = [,屬于左括號(hào),入棧,此時(shí)棧內(nèi)有{[
第三步:讀取ch = (,屬于左括號(hào),入棧,此時(shí)棧內(nèi)有{[(
第四步:讀取ch = ),屬于右括號(hào),嘗試讀取棧頂元素(和)正好匹配,將(出棧,此時(shí)棧內(nèi)還剩{[
第五步:讀取ch = ],屬于右括號(hào),嘗試讀取棧頂元素[和]正好匹配,將[出棧,此時(shí)棧內(nèi)還剩{
第六步:讀取ch = },屬于右括號(hào),嘗試讀取棧頂元素{和}正好匹配,將{出棧,此時(shí)棧內(nèi)還剩''
第七步:棧內(nèi)只能'',s = "{[()]}"符合有效的括號(hào)定義,返回true
代碼實(shí)現(xiàn):
const isValid = (s) => { // 空字符串符合條件 if (!s) { return true } const leftToRight = { '(': ')', '[': ']', '{': '}' } const stack = [] for (let i = 0, len = s.length; i < len; i++) { const ch = s[i] // 左括號(hào) if (leftToRight[ch]) { stack.push(ch) } else { // 右括號(hào)開始匹配 // 1. 如果棧內(nèi)沒(méi)有左括號(hào),直接false // 2. 有數(shù)據(jù)但是棧頂元素不是當(dāng)前的右括號(hào) if (!stack.length || leftToRight[ stack.pop() ] !== ch) { return false } } } // 最后檢查棧內(nèi)還有沒(méi)有元素,有說(shuō)明還有未匹配則不符合 return !stack.length }
暴力解法雖然符合我們?nèi)粘5乃季S,但是果然還是棧結(jié)構(gòu)解法好了不少。
結(jié)尾
面試中,算法到底該不該成為考核候選人的重要指標(biāo)咱們不吐槽,但是近幾年幾乎每個(gè)大廠都將算法放進(jìn)了前端面試的環(huán)節(jié),為了獲得心儀的offer,重溫?cái)?shù)據(jù)結(jié)構(gòu),刷刷題還是很有必要的,愿你我都被算法溫柔以待。
到此這篇關(guān)于JavaScript算法面試題匯總的文章就介紹到這了,更多相關(guān)JavaScript算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
setInterval 和 setTimeout會(huì)產(chǎn)生內(nèi)存溢出
jscript 5.7 發(fā)布修復(fù)了不少ie javascript內(nèi)存泄露的問(wèn)題。但是leak依然存在。當(dāng)我們頻繁使用 setInterval 和 setTimeout 時(shí)就會(huì)每幾秒鐘出現(xiàn)32k leak...2008-02-02前端項(xiàng)目npm?install?安裝依賴報(bào)錯(cuò)的解決方案(三種問(wèn)題解決方案)
本文給大家介紹前端項(xiàng)目npm?install?安裝依賴報(bào)錯(cuò)的解決方案(三種問(wèn)題解決方案),給大家總結(jié)了前端項(xiàng)目安裝依賴,遇到過(guò)的問(wèn)題,每一種問(wèn)題給大家完美解決方案,感興趣的朋友一起看看吧2023-12-12JavaScript 數(shù)據(jù)元素集合與數(shù)組的區(qū)別說(shuō)明
我們?cè)讷@取一組頁(yè)面元素時(shí)常會(huì)用到getElementsByName()或是getElementsByTagName()方法。2010-05-05