JavaScript算法面試題
前言:
現(xiàn)實(shí)總是殘酷的,最近有個(gè)學(xué)妹在換工作,面試前什么手寫Priomise、vue雙向綁定原理,webpack優(yōu)化方式,準(zhǔn)備了一大堆,本以為成竹在胸,結(jié)果卻在算法上吃了大虧,心儀的offer沒有拿到,一度懷疑人生。到底是什么算法題能讓面試官對妹子說出你都工作3年了,這個(gè)算法題都不會(huì)?這樣的狠話?
有效的括號問題
這是一道leetcode上的原題,本意是在考察候選人對
棧數(shù)據(jù)結(jié)構(gòu)的掌握。來看看題目
給定一個(gè)只包括 '(',')','{','}','[',']' 的字符串 s ,判斷字符串是否有效。 有效字符串需滿足:
- 左括號必須用相同類型的右括號閉合。
- 左括號必須以正確的順序閉合。
示例:
示例 1:
輸入:s = "()"
輸出:true
示例 2:
輸入:s = "()[]{}"
輸出:true
示例 3:
輸入:s = "(]"
輸出:false
示例 4:
輸入:s = "([)]"
輸出:false
示例 5:
輸入:s = "{[]}"
輸出:true
解題信息
如果咱們確實(shí)沒有刷過算法,不知道那么多套路,通過題目和示例盡可能的獲取到更多的信息就很重要了。
根據(jù)題目推斷出:
- 字符串s的長度一定是偶數(shù),不可能是奇數(shù)(
一對對匹配)。 右括號前面一定跟著左括號,才符合匹配條件,具備對稱性。右括號前面如果不是左括號,一定不是有效的括號。
暴力消除法
得到了以上這些信息后,胖頭魚想既然是
[]、{}、()成對的出現(xiàn),我能不能把他們都挨個(gè)消除掉,如果最后結(jié)果是空字符串,那不就意味著符合題意了嗎?
舉個(gè)例子:
輸入:s = "{[()]}"
第一步:可以消除()這一對,結(jié)果s還剩{[]}
第二步: 可以消除[]這一對,結(jié)果s還剩{}
第三步: 可以消除{}這一對,結(jié)果s還剩'' 所以符合題意返回true
代碼實(shí)現(xiàn):
const isValid = (s) => {
while (true) {
let len = s.length
// 將字符串按照匹配對,挨個(gè)替換為''
s = s.replace('{}', '').replace('[]', '').replace('()', '')
// 有兩種情況s.length會(huì)等于len
// 1. s匹配完了,變成了空字符串
// 2. s無法繼續(xù)匹配,導(dǎo)致其長度和一開始的len一樣,比如({],一開始len是3,匹配完還是3,說明不用繼續(xù)匹配了,結(jié)果就是false
if (s.length === len) {
return len === 0
}
}
}
暴力消除法最終還是可以通過leetcode的用例,就是性能差了點(diǎn),哈哈

棧解題法
解題信息中的第2條強(qiáng)調(diào)對稱性,而
棧(后入先出)入棧和出棧恰好是反著來,形成了鮮明的對稱性。
入棧:abc,出棧:cba
abc
cba
所以可以試試從棧的角度來解析:
輸入:s = "{[()]}"
第一步:讀取ch = {,屬于左括號,入棧,此時(shí)棧內(nèi)有{
第二步:讀取ch = [,屬于左括號,入棧,此時(shí)棧內(nèi)有{[
第三步:讀取ch = (,屬于左括號,入棧,此時(shí)棧內(nèi)有{[(
第四步:讀取ch = ),屬于右括號,嘗試讀取棧頂元素(和)正好匹配,將(出棧,此時(shí)棧內(nèi)還剩{[
第五步:讀取ch = ],屬于右括號,嘗試讀取棧頂元素[和]正好匹配,將[出棧,此時(shí)棧內(nèi)還剩{
第六步:讀取ch = },屬于右括號,嘗試讀取棧頂元素{和}正好匹配,將{出棧,此時(shí)棧內(nèi)還剩''
第七步:棧內(nèi)只能'',s = "{[()]}"符合有效的括號定義,返回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]
// 左括號
if (leftToRight[ch]) {
stack.push(ch)
} else {
// 右括號開始匹配
// 1. 如果棧內(nèi)沒有左括號,直接false
// 2. 有數(shù)據(jù)但是棧頂元素不是當(dāng)前的右括號
if (!stack.length || leftToRight[ stack.pop() ] !== ch) {
return false
}
}
}
// 最后檢查棧內(nèi)還有沒有元素,有說明還有未匹配則不符合
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
setInterval 和 setTimeout會(huì)產(chǎn)生內(nèi)存溢出
jscript 5.7 發(fā)布修復(fù)了不少ie javascript內(nèi)存泄露的問題。但是leak依然存在。當(dāng)我們頻繁使用 setInterval 和 setTimeout 時(shí)就會(huì)每幾秒鐘出現(xiàn)32k leak...2008-02-02
前端項(xiàng)目npm?install?安裝依賴報(bào)錯(cuò)的解決方案(三種問題解決方案)
本文給大家介紹前端項(xiàng)目npm?install?安裝依賴報(bào)錯(cuò)的解決方案(三種問題解決方案),給大家總結(jié)了前端項(xiàng)目安裝依賴,遇到過的問題,每一種問題給大家完美解決方案,感興趣的朋友一起看看吧2023-12-12
JavaScript 數(shù)據(jù)元素集合與數(shù)組的區(qū)別說明
我們在獲取一組頁面元素時(shí)常會(huì)用到getElementsByName()或是getElementsByTagName()方法。2010-05-05

