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

矩阵乘法计算量估算

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

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            //矩阵个数
            int n = in.nextInt();
            //矩阵大小:按序存入
            List<List<Integer>> list = new ArrayList<>();
            //矩阵大小
            for (int i = 0; i < n; i++) {
                List<Integer> li = new ArrayList<>();
                //行数
                int x = in.nextInt();
                //列数
                int y = in.nextInt();
                li.add(x);
                li.add(y);
                list.add(li);
            }
            //计算表达式
            String rule = in.next();
            //表达式栈
            Stack<Character> stack = new Stack<>();
            //表达式中每个矩阵出现的位置
            Map<Character, Integer> map = new HashMap<>();
            //矩阵的位置
            int count = 0;
            //计算顺序
            List<String> order = new ArrayList<>();
            for (int i = 0; i < rule.length(); i++) {
                char ch = rule.charAt(i);
                if (Character.isLetter(ch)) {
                    //是矩阵名,记录名称和位置
                    map.put(ch, count);
                    count++;
                    //名称入栈,计算优先级
                    stack.push(ch);
                } else if (ch == '(') {
                    stack.push(ch);
                } else {
                    StringBuilder s = new StringBuilder();
                    while (stack.peek() != '(') {
                        char op = stack.pop();
                        s.append(op);
                    }
                    //左括号出栈
                    stack.pop();
                    //表达式保存:反转顺序与输入保持一致
                    String exp = s.reverse().toString();
                    order.add(exp);
                }
            }
            //如A(BC)式,栈可能不为空
            while (!stack.isEmpty()) {
                order.add(stack.pop() + "");
            }
            //保存整个表达式按序计算后的矩阵的大小
            int[] Arr = new int[] {0, 0};
            //整个表达式的计算量:每一部分的计算量之和
            int total = 0;
            for (String s : order) {
                //某部分的计算量
                int sum = 0;
                //计算s得到的矩阵大小,若s为单个矩阵,则是该矩阵的大小
                int[] tempArr = new int[] {0, 0};
                for (int i = 0; i < s.length(); i++) {
                    int c = map.get(s.charAt(i));
                    //获取第c个数组大小
                    List<Integer> size = list.get(c);
                    if (tempArr[0] != 0) {
                        int compute = tempArr[0] * tempArr[1] * size.get(1);
                        sum += compute;
                        //更新
                        tempArr[1] = size.get(1);
                    } else {
                        //临时数组初始化值
                        tempArr[0] = size.get(0);
                        tempArr[1] = size.get(1);
                    }
                }
                total += sum;
                if (Arr[0] != 0) {
                    //B(CD)式,先计算CD
                    int d = 0;
                    if (Arr[0] == tempArr[1]) {
                        total+= tempArr[0] * tempArr[1] * Arr[1];
                        Arr[0] = tempArr[0];
                    } else if (Arr[1] == tempArr[0]) {
                        //(BC)D式,计算BC
                        total+= Arr[0] * Arr[1] * tempArr[1];
                        Arr[1] = tempArr[1];
                    }
                } else {
                    Arr[0] = tempArr[0];
                    Arr[1] = tempArr[1];
                }
            }
            System.out.println(total);
        }
    }
}

每次做字符串的题都会怀疑自己是不是不适合写算法,纯纯暴力小子

全部评论

相关推荐

06-05 19:46
已编辑
武汉大学 后端
点赞 评论 收藏
分享
06-04 09:27
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务