224. 基本计算器

题目:

思路:

【1】无

代码展示:

//时间10 ms 击败 75.48%
//内存42.9 MB 击败 44.49%
class Solution {
    public int calculate(String s) {
        Deque<Integer> ops = new LinkedList<Integer>();
        ops.push(1);
        int sign = 1;

        int ret = 0;
        int n = s.length();
        int i = 0;
        while (i < n) {
            if (s.charAt(i) == ' ') {
                i++;
            } else if (s.charAt(i) == '+') {
                sign = ops.peek();
                i++;
            } else if (s.charAt(i) == '-') {
                sign = -ops.peek();
                i++;
            } else if (s.charAt(i) == '(') {
                ops.push(sign);
                i++;
            } else if (s.charAt(i) == ')') {
                ops.pop();
                i++;
            } else {
                long num = 0;
                while (i < n && Character.isDigit(s.charAt(i))) {
                    num = num * 10 + s.charAt(i) - '0';
                    i++;
                }
                ret += sign * num;
            }
        }
        return ret;
    }
}

//时间1 ms 击败 100%
//内存42.9 MB 击败 41.82%
class Solution {
    int len;
    public int calculate(String s) {

        char[] cs = s.toCharArray();
        this.len = cs.length;
        return backTrack(cs, 0)[0];
    }
    // 元素 1 表示 区间 和 元素2 表示区间的右边界
    public int[] backTrack(char[] cs, int p){

        char c = ' ';
        char op = '+';
        int res = 0;
        int num = 0;
        for(int i = p; i < len; ++i){

            c = cs[i];
            if(c > 47 && c < 58) num = num * 10 + c - 48;
            else if(c == '+' || c == '-'){

                res = op == '+' ? res + num : res - num;
                op = c;
                num = 0;
            }else if(c == '('){

                int[] sub = backTrack(cs, i + 1);
                num = sub[0];
                //更新边界
                i = sub[1];
            }else if(c == ')'){

                res = op == '+' ? res + num : res - num;
                return new int[]{res, i};
            }
        }
        res = op == '+' ? res + num : res - num;
        return new int[]{res, len};
    }
}


//时间4 ms 击败 97.54%
//内存42.7 MB 击败 57.50%
class Solution {
    public int calculate(String s) {
        /*存放当前的计算结果*/
        int result = 0;
        /*存放当前待计算数字*/
        int num = 0;
        /*符号,加号(+1)或者减号(-1)*/
        int sign = 1;
        Deque<Integer> stack = new LinkedList<>();
        char[] charArray = s.toCharArray();

        for (int i = 0; i < charArray.length; i++) {
            char c = charArray[i];
            /*如果当前字符为' ',无需处理*/
            if (c == ' ') {
                continue;
            }
            /*如果当前字符是一个数字,则用num进行记录,当然需要考虑到数字不止一位
            所以 num = num * 10 + c - '0'*/
            if (c >= '0' && c <= '9') {
                num = num * 10 + c - '0';
                if (i < charArray.length - 1 && '0' <= charArray[i + 1] && charArray[i + 1] <= '9') {
                    continue;
                }
            }
            /*如果当前字符为计算符号*/
            else if (c == '+') {
                num = 0;
                sign = 1;
            } else if (c == '-') {
                num = 0;
                sign = -1;
            }
            /*如果当前符号为'(',需要将前面的计算结果和符号入栈。 存在括号里套括号的情况,所以使用栈*/
            else if (c == '(') {
                stack.push(result);
                stack.push(sign);
                result = 0;
                sign = 1;
            }
            /*如果当前符号为')',括号里的表达式已经计算完成了,
            可以和括号外的结果进行合并计算了*/
            else if (c == ')') {
                /*计算符号出栈*/
                sign = stack.pop();
                /*将num替换为括号中的计算结果*/
                num = result;
                /*将result替换为括号前边的计算结果*/
                result = stack.pop();
            }
            /*每循环一次,得到一个新的结果*/
            result += sign * num;
        }

        return result;
    }
}

 

posted @ 2023-06-15 12:26  忧愁的chafry  阅读(10)  评论(0编辑  收藏  举报