面试常规算法题

一串字符串,先算括号里面的,然后再算外面的,与操作。。(主要考察括号处理,与操作没有实际意义)

import java.util.*;
public class Test {
    public static void main(String[] args) {
        String s = "0101(11001)11(101(110)111)111";
        System.out.println(binary_and(s));
    }
    public static int binary_and(String s){
        Stack<Character> stack = new Stack<>();
        int count = 1, i = 0, kuohao = 0;
        while(i < s.length()){
            if(s.charAt(i) == '('){
                kuohao ++;
                stack.push(s.charAt(i));
                i++;
                while(kuohao != 0){
                    while(s.charAt(i) != ')'){
                        if(s.charAt(i) == '(') kuohao ++;
                        stack.push(s.charAt(i));
                        i++;
                    }
                    //i此刻等于右括号
                    int temp = 1;
                    while(stack.peek() != '('){
                        temp &= (stack.pop() - '0') ;
                    }
                    stack.pop(); // 把左括号弹出去
                    kuohao --;
                    stack.push((char)temp);   
                    i++;
                }
            }else{
                if(!stack.isEmpty()) count &= stack.pop() - '0';
                count &= (s.charAt(i) - '0');
                i++;
            }
        }
        return count;
    }
}

上一个版本有问题。。。自己写的算法怎么这么长,经常就陷入处理细节方面,而不是从宏观上去解决问题,导致细节特别多,代码越写越长,反而产生问题

import java.util.*;
public class Test {
    public static void main(String[] args) {
        String s = "1(01(11011)110)(0)";
        System.out.println(binary_and(s));
    }
    public static int binary_and(String s){
        Stack<Character> stack = new Stack<>();
        int count = 1, i = 0, kuohao = 0;
        while(i < s.length()){
            if(s.charAt(i) == '('){
                kuohao ++;
                stack.push(s.charAt(i));
                i++;
                while(kuohao != 0){
                    while(s.charAt(i) != ')'){
                        if(s.charAt(i) == '(') kuohao ++;
                        stack.push(s.charAt(i));
                        i++;
                    }
                    //i此刻等于右括号
                    int temp = 1;
                    while(stack.peek() != '('){
                        temp &= (stack.pop() - '0') ;
                    }
                    stack.pop(); // 把左括号弹出去
                    kuohao --;
                    stack.push((char)temp);
                    i++;
                }
            }
                if(!stack.isEmpty()){
                    count &= stack.pop() - '0';
                    continue;
                }else{
                    count &= (s.charAt(i) - '0');
                    i++;
                }
        }
        return count;
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务