java面试题,题目1代码块,静态代码块;题目2括号匹配算法

题目1.写出下面代码运行的结果

class Animal {
    public Animal() {  System.out.println("Animal构造");  }
    
    {  System.out.println("Animal代码块");  }
    
    static{  System.out.println("Animal静态代码块");  }
}

class Tiger extends Animal{
    public Tiger() {  System.out.println("Tiger构造");  }
    
    {  System.out.println("Tiger代码块");  }
    
    static{  System.out.println("Tiger静态代码块");  }
    
}
class Test{
    public static void main(String[] args) {
        new Tiger();
    }
}

 

答案:

Animal静态代码块
Tiger静态代码块
Animal代码块
Animal构造
Tiger代码块
Tiger构造

结论:1.静态代码块优先级最高,直接从父类初始化到子类

   2.代码块和构造方法都属于对象,同样先初始化父级,

   3.代码块的优先级高于构造方法。

   4.顺序:   父类静态代码->子类静态代码->父类代码块->父类构造->子类代码块->子类构造

 

题目2.写一个静态方法来判断一个字符串中的括号是否匹配。给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效

例如:

String str1 = "[(])";                           false
String str2 = "(])";                            false
String str3 = "([[]()])";                      true
String str4 = "([{}])";                       true

 

分析:

1.首先因想到需要把字符串中的每一个括号都取出来判断一下。

2.然后我们怎么来匹配括号呢?

3.因为左括号和右括号必须成对出现。使用栈方便逻辑编写

 

算法思路:

1.左括号全部入栈

2.判断是否有左括号,没有直接返回false

3.遇到左括号进行全部压栈

4.如果遇到右括号则出栈,然后进行判断,不符合则返回

其中两种特殊情况。

(1)循环时,如果栈为空,则说明右括号比左括号多,返回false
(2)循环结束时,如果栈非空,则说明左括号比右括号多,返回false

 

答案:

public static void main(String[] args) {
        String str1 = "[(])";
        String str2 = "(])";
        String str3 = "([[]()])";
        String str4 = "([{}])";
        System.out.println(isValid(str1));
        System.out.println(isValid(str2));
        System.out.println(isValid(str3));
        System.out.println(isValid(str4));
    }
    public static boolean isValid(String str) {
        Stack stack = new Stack();                            //使用栈集合
        for(int i=0;i<str.length();i++) {                    //遍历字符串每一位
            if (str.charAt(i)=='['||str.charAt(i)=='('||str.charAt(i)=='{') {
                stack.push(str.charAt(i));            //判断如果时左括号类型就加入栈集合
            }else {                        //否则右括号就比对
                //如果栈里没有左括号了,但是字符串中还存在右括号,即不匹配直接返回false
                if (stack.isEmpty()) {  
                    return false;
                }
                //如果是']'类型的右括号,就出栈一个比对是不是'['如果不是返回false
                if (str.charAt(i)==']'&&(char)stack.pop()!='[') {
                    return false;
                }
                //如果是'}'类型的右括号,就出栈一个比对是不是'{'如果不是返回false
                if (str.charAt(i)=='}'&&(char)stack.pop()!='{') {
                    return false;
                }
                //如果是')'类型的右括号,就出栈一个比对是不是'('如果不是返回false
                if (str.charAt(i)==')'&&(char)stack.pop()!='(') {
                    return false;
                }
            }//else结束
        }//for循环结束
        return stack.isEmpty();//如果for循环结束了,栈中还有左括号就返回false,如果已经空了就返回true
    }

 

posted @ 2019-02-27 10:21  大火yzs  阅读(470)  评论(0编辑  收藏  举报