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

矩阵乘法计算量估算

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

#include <iostream>
using namespace std;
#include <stack>
#include <string>
#include <vector>
int caculate(int x, int y, int z) {
    return x * y * z;
}

int main() {
    int n;
    cin >> n;
    vector<pair<int, int>> mas;
    // cout << "n: " << n << endl;
    for (int i = 0; i < n; i++) {
        int a, b;
        cin >> a >> b;
        // cout << "ab: " << a <<" "<< b << endl;
        mas.emplace_back(a, b);
    }
    string str;
    cin >> str;
    stack<char> sk;
    stack<pair<int, int>> mask;
    // j指向当前入栈矩阵在mas数组中的编号,初始为-1
    int res = 0;

    // cout << "str: " << str << endl;
    for (int i = 0, j = 0; i < str.size(); i++) {
        if (str[i] == '(') {
            sk.push('(');
        } else if (str[i] >= 'A' && str[i] <= 'Z') {

            if (sk.top() != '(') {
                int x = mask.top().first;
                int y = mask.top().second;
                int z = mas[j].second;
                res = res + caculate(x, y, z);
                mask.pop();
                mask.push(pair<int, int>(x, z));
                j++;
            } else {
                sk.push(str[i]);
                mask.push(mas[j]);
                j++;
            }
        } else if (str[i] == ')') {
            sk.pop();
            sk.pop();
            if (!sk.empty() && sk.top() != '(') {
                int z = mask.top().second;
                mask.pop();
                int x = mask.top().first;
                int y = mask.top().second;
                res = res + caculate(x, y, z);
                mask.pop();
                mask.push(pair<int, int>(x, z));
            } else if (!sk.empty() && sk.top() == '(') {
                sk.push('X');
            }
        }
    }
    cout << res << endl;
}

主要是对输入的处理,使用栈,对每个进入的字符进行判断,如果上一入栈的也是矩阵,则计算2者的乘法次数加到总数上,弹出旧的矩阵信息并将新矩阵信息入栈,符号不动(2矩阵相乘剩下一个矩阵),若为左括号则直接入栈,若为右括号则弹出一个2个符号并在栈非空时补入一个矩阵型符号。矩阵的信息单独拿一个数组和一个栈来保存。

栈的用法,总体思路可以参考HJ50四则运算,不过这个只有一种运算,一个栈(逻辑上的)就够了,只不过字符不包含矩阵信息,所以多用了个栈来存储矩阵的信息,所以看上去比较绕。

华为机试刷题记录 文章被收录于专栏

记录一下手打代码的解题思路方便复习

全部评论

相关推荐

到我怀里来:教育背景不用写主修课程,还有你写班级排名是什么意思?咋不写寝室排名呢😂要写就写年纪排名。得了那么多奖结果项目经历什么技术细节都不写清楚,把技术细节写清楚,用了什么技术解决了什么问题,“用了python语言、用了SQL语言”,有这样写的?hr一看就知道你是包装的或者比赛的奖是混的,你什么技术细节都不懂。校内职务全删了,什么三好学生、文明寝室这些你写上去干嘛?重复的奖学金你写三次干嘛?自我评价写那么多干嘛?谁想看这些
点赞 评论 收藏
分享
点赞 评论 收藏
分享
2024-11-14 16:13
已编辑
重庆科技大学 测试工程师
Amazarashi66:不进帖子我都知道🐮❤️网什么含金量
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务