今天在牛课网上做了一道去年去哪网的线上笔试题,就是表达式合法判断的问题,很基础一个题目,考察栈的应用。结果做了一个上午测试用例总是不能完全通过,细看题目原来人家是这样要求的

并没有要求左右括号严格匹配,瞬间无语,做题之前还是要认真把题目读懂。
下面粘出答案
1 //表达式合法的判断 -- 栈 2 public static boolean chkLegal(String A) { 3 Stack<Character> left = new Stack<Character>(); 4 for(int i =0; i<A.length(); i++){ 5 char c = A.charAt(i); 6 if(c=='{' || c=='[' || c=='('){ 7 left.push(c); 8 } 9 //没有要求左右括号严格匹配 10 if(c=='}' || c==']' || c==')'){ 11 if(left.isEmpty()){ //右括号多出不合法 12 return false; 13 }else{ 14 left.pop(); 15 } 16 } 17 } 18 if(!left.isEmpty()){ //左括号多出不合法 19 return false; 20 } 21 return true; 22 }
这是严格匹配的代码片段
1 if(c=='}' || c==']' || c==')'){ 2 if(left.isEmpty()){ //右括号多出不合法 3 return false; 4 }else{ 5 char top = left.pop(); 6 if((c=='}'&&top !='{') || (c==']'&&top !='[') || (c==')'&&top !='(')){ 7 return false; 8 } 9 } 10 }
然后发现答案中有一种解法个人感觉很巧妙,就是把左右括号当成一对键值对存储在map中,这样的话当有大量不同种类的括号需要匹配的时候,只需要添加就可以了,自己也可以随机定义字符,这是引用的代码
1 HashMap<Character,Character> map = new HashMap<Character,Character>(); 2 map.put('[',']'); 3 map.put('{','}'); 4 map.put('(',')'); 5 for(int i =0; i<A.length(); i++){ 6 char c = A.charAt(i); 7 if(map.containsKey(c)){ 8 left.push(c); 9 continue; 10 }else if(map.containsValue(c)){ 11 if(left.isEmpty()) 12 return false; 13 left.pop(); 14 } 15 }
总结:现在也差不多找实习了,线上笔试的时候尤其要注意把题目读懂再答题比较重要;
对于某些要求可以巧妙的利用一些数据结构,比如表达式判断问题就是利用栈的先进后出原则进行匹配判断;
巧用一些关键字可以提高性能,尤其在循环中,break,continue等关键字的利用。
浙公网安备 33010602011771号