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

       

 并没有要求左右括号严格匹配,瞬间无语,做题之前还是要认真把题目读懂。

 下面粘出答案

 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等关键字的利用。

     

 

posted on 2017-03-12 21:04  牛扎糖  阅读(321)  评论(0)    收藏  举报