day33(12.14)——leetcode面试经典150

150. 逆波兰表达式求值

150. 逆波兰表达式求值

题目:

题解:

java 复制代码
class Solution {
    public static boolean isNumeric(String str) {
        return str != null && str.matches("-?\\d+");
    }

    public int evalRPN(String[] tokens) {
        //将数字放在一个集合中
        List<Integer> list = new ArrayList<>();
        for(int i=0;i<tokens.length;i++) {
            String c = tokens[i];
            if(isNumeric(c)) {
                list.add(Integer.valueOf(c));
            }
            else {
                Integer a = list.remove(list.size()-1);
                Integer b = list.remove(list.size()-1);
                Integer r = 0;
                if("+".equals(c)) {
                    r = a+b;
                }
                else if("-".equals(c)) {
                    r = b-a;
                }
                else if("*".equals(c)) {
                    r = b * a;
                }
                else {
                    r = (int)b/a;
                }
                list.add(r);
            }
        }
        return list.get(0);
    }
}

224. 基本计算器

224. 基本计算器

很难,很麻烦,要考虑的东西很多,就像我昨天考的六级一样

题目:

题解:

java 复制代码
class Solution {
    public int calculate(String s) {
        // 存放所有的数字
        Deque<Integer> nums = new ArrayDeque<>();
        // 为了防止第一个数为负数,先往 nums 加个 0
        nums.addLast(0);
        // 将所有的空格去掉
        s = s.replaceAll(" ", "");
        // 存放所有的操作,包括 +/-
        Deque<Character> ops = new ArrayDeque<>();
        int n = s.length();
        char[] cs = s.toCharArray();
        for (int i = 0; i < n; i++) {
            char c = cs[i];
            if (c == '(') {
                ops.addLast(c);
            } else if (c == ')') {
                // 计算到最近一个左括号为止
                while (!ops.isEmpty()) {
                    char op = ops.peekLast();
                    if (op != '(') {
                        calc(nums, ops);
                    } else {
                        ops.pollLast();
                        break;
                    }
                }
            } else {
                if (isNum(c)) {
                    int u = 0;
                    int j = i;
                    // 将从 i 位置开始后面的连续数字整体取出,加入 nums
                    while (j < n && isNum(cs[j])) u = u * 10 + (int)(cs[j++] - '0');
                    nums.addLast(u);
                    i = j - 1;
                } else {
                    if (i > 0 && (cs[i - 1] == '(' || cs[i - 1] == '+' || cs[i - 1] == '-')) {
                        nums.addLast(0);
                    }
                    // 有一个新操作要入栈时,先把栈内可以算的都算了
                    while (!ops.isEmpty() && ops.peekLast() != '(') calc(nums, ops);
                    ops.addLast(c);
                }
            }
        }
        while (!ops.isEmpty()) calc(nums, ops);
        return nums.peekLast();
    }
    void calc(Deque<Integer> nums, Deque<Character> ops) {
        if (nums.isEmpty() || nums.size() < 2) return;
        if (ops.isEmpty()) return;
        int b = nums.pollLast(), a = nums.pollLast();
        char op = ops.pollLast();
        nums.addLast(op == '+' ? a + b : a - b);
    }
    boolean isNum(char c) {
        return Character.isDigit(c);
    }
}
相关推荐
我命由我1234527 分钟前
田野笔记极简理解
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
局部有解3 小时前
Leetcode Hot100 - 最长连续序列
算法·leetcode·职场和发展
java_nnnn3 小时前
LeetCode刷题滑动窗口(最大连续1的个数三+将x减到0的最小操作数)Java
算法·leetcode·职场和发展
SamDeepThinking3 小时前
synchronized 和 lock 有什么区别?
java·后端·面试
考研保研资料分享3 小时前
普通211核专业保研经验:清华预推免录取与北大、西交面试复盘
面试·职场和发展
背调与用工合规夏律师4 小时前
知情同意在跨境提供与境外接收方信息上的证据要求
职场和发展
人道领域4 小时前
【面试八股速通篇01】锁与并发工具
java·开发语言·面试·c#
SunShaoLu4 小时前
流程图工具怎么选:5 款产品的技术对比与选型实践
人工智能·职场和发展·流程图·效率工具
考研保研资料分享4 小时前
2022数学保研经验:211专业第一的中科大、浙大、南开等五校考核复盘
面试
十年Java程序媛4 小时前
Redis 分布式锁 + GZIP 压缩缓存踩坑|高并发缓存真实线上复盘
java·开发语言·spring boot·redis·分布式·缓存·面试