当前位置: 首页 > Web前端 > HTML

面试官:你工作3年了,你不会这道算法题?

时间:2023-03-28 11:16:26 HTML

前言金三银四,正是跳槽的最佳时机,我幻想着只要跳槽,就能离开这个“鸟居”,持有更多的钱,做最好的事情……然而,现实总是残酷的。最近,一位女学生正在换工作。面试前,她准备了很多手写的Priomise,vue双向绑定原理,webpack优化方法。亏大了,没有拿到想要的offer,一度怀疑人生。什么样的算法题能让面试官告诉妹子,你工作3年了,这道算法题你做不出来?这么狠话?有效括号题这是leetcode上的一道原创题,初衷是考查考生对栈数据结构的掌握情况。看题目给定一个只包含'(',')','{','}','[',']'的字符串s,判断该字符串是否合法。一个有效的字符串需要满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例示例1:输入:s="()"输出:true示例2:输入:s="()[]{}"输出:true示例3:输入:s="(]"输出:false示例4:输入:s="([)]"输出:false例5:输入:s="{[]}"输出:true解题信息如果我们真的没刷过算法,不知道那么多套路,过一遍题和例子获取尽可能多的信息是很重要的,根据题目可以推导出字符串s的长度一定是偶数,不能是奇数(一对一匹配)。右括号必须在左括号之前才能匹配条件,具有对称性。如果右括号之前没有左括号,则它一定不是有效括号。暴力淘汰法胖头鱼在得到以上信息后想到,既然[],{},()都是成对出现的,那我是不是可以一一淘汰,如果最后的结果是一个空串,说明是否符合标题?例如输入:s="{[()]}"第一步:可以消去()对,s的结果为{[]}第二步:可以消去[]对,得到resultofsstillRemaining{}第三步:可以消去一对{},结果是''留在s中,所以符合题意,返回true。代码实现constisValid=(s)=>{while(true){letlen=s.length//根据匹配对逐个替换字符串为''s=s.replace('{}','').replace('[]','').replace('()','')//有两种情况s.length会等于len//1.s匹配完成而变成空字符串//2.s无法继续匹配,导致其长度与初始len相同,如({],a开头len为3,匹配后还是3,表示不需要继续匹配,结果为falseif(s.length===len){returnlen===0}}}暴力淘汰法最终可以通过leetcode的用例,只不过性能差了一点,哈哈栈解题法解题资料中的第二项强调对称性,栈(后进先出)出栈恰好相反,形成了尖锐的对称性.入栈:abc,出栈:cbaabccba,所以可以尝试从栈的角度来分析:输入:s="{[()]}"第一步:读取ch={,属于到左括号,入栈,this当栈中有{时第二步:读取属于左括号的ch=[,入栈。这时栈中就有了{[。有{[(step4:readch=),属于右括号,尝试读取栈顶元素(and)刚好匹配,pop(出栈,还有{[step5:readch=],属于右括号,尝试读取栈顶元素[和]完全匹配,pop[出栈,栈中还有{step6:readch=},属于右括号,尝试读取栈顶的元素{和}完全匹配,{被弹出栈,此时栈中还有''第7步:只有''在栈中,s="{[()]}"符合有效括号定义,返回一个真码ImplementconstisValid=(s)=>{//空字符串满足条件if(!s){returntrue}constleftToRight={'(':')','[':']','{':'}'}conststack=[]for(leti=0,len=s.length;我