题解 | #矩阵乘法计算量估算#

矩阵乘法计算量估算

https://www.nowcoder.com/practice/15e41630514445719a942e004edc0a5b

// mark一下
// 1. 和四则运算类题目一致 使用双栈求解
// 2. ( 直接入栈;字母直接入栈;)就进行一次计算
// 3. 计算后的结果,入栈时,将 AB 一个整体作为新的操作数入栈 并缓存其对应的矩阵的行列数
// 4. 需要保证整个输入表达式被小括号包围 如果没有 手动添加 保证能完全计算 且 最后不需要再进行判断 操作符栈必定能为空
// 5. 进行手写模拟 以熟悉过程

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            int n = Integer.valueOf(in.nextLine());
            Stack<String> numStack = new Stack<>();
            Stack<String> opStack = new Stack<>();
            Map<String, String> hashMap = new HashMap<>();
            char c = 'A';
            for (int i = 0; i < n; i++) {
                String eachLine = in.nextLine();
                hashMap.put(String.valueOf((char) (c + i)), eachLine);
            }
            String rule = in.nextLine();
            // 需要最外层括号包裹
            // rule = "(" + rule + ")";
            int length = rule.length();
            int ans = 0;
            for (int i = 0; i < length; i++) {
                char curC = rule.charAt(i);
                String curCStr = String.valueOf(curC);
                if (curC == '(') {
                    opStack.push(curCStr);
                } else if (curC >= 'A' && curC <= 'Z') {
                    numStack.push(curCStr);
                } else if (curC == ')') {
                    // 和四则运算不一致的地方:每次遇到)都进行一次计算即可
                    // while (!opStack.isEmpty() && !opStack.peek().equals("(")) {
                        String l2 = numStack.pop();
                        String l1 = numStack.pop();
                        String num2 = hashMap.get(l2);
                        String num1 = hashMap.get(l1);
                        ans += calc(num1, num2);
                        numStack.push(l1 + l2);
                        hashMap.put(l1 + l2, num1.split(" ")[0] + " " + num2.split(" ")[1]);
                    // }
                    // opStack.pop();
                }
            }

            // 最外层有一对括号 所以不用类似表达式计算一样继续算

            System.out.println(ans);
        }
    }

    public static int calc(String num1, String num2) {
        int x = Integer.valueOf(num1.split(" ")[0]);
        int y = Integer.valueOf(num1.split(" ")[1]);
        int z = Integer.valueOf(num2.split(" ")[1]);
        return x * y * z;
    }
}

全部评论

相关推荐

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