前言
【典型例子】
给定一个只包含”(“,”)“,”[“,”]“,”{“,”}“的字符串,判断字符串是否有效,字符串有效需要满足如下条件:左括号必须用相同类型的右括号闭合;左括号必须以正确的顺序闭合。
注意:空字符串可以被认为是有效字符串。
代码
function isValid(s) { let arr = []; s = s.split(''); for( var v of s){ if(v === ' ') continue; else if(v === '(') arr.push(')'); else if(v === '{') arr.push('}'); else if(v === '[') arr.push(']'); else if(arr.length === 0 || arr.pop() !== v) return false; } return arr.length === 0 ? true : false; } // let str = '( ) {}[()]';//true let str = '( ) {}[(}{)]';//false console.log(isValid(str));
思路分析
这题最巧妙之处在于arr.length === 0 || arr.pop() !== v,如果初级到中级的前端工程师,往往会写成else if(!arr.length) return false; else if(arr.pop() != v) return false; 而arr.pop()删除数组的最后一个元素,也对应一开始最左侧的元素值;
我们假设传入的值为'( ) {}[()][',第一步就会往我们arr数组内添加')',然后第二步发现无法识别,就删除,因为 arr.length === 0 || arr.pop() !== v,这里的arr.pop() !== v就是判断右括号和左括号是否相符,比如传入')',此时删除的也是')',那么两者相等,就不会返回false。
总结
有时候我们看似最简单的代码往往可以优化的非常精妙,因此思想的养成非常重要,作为一名程序员,设计思想远比所会的框架api等重要的多!要做架构而非码农。