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

矩阵乘法计算量估算

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

借用一下其他大神的代码做一下解析,其中有个坑是之前个人一直想不通的,通过这位大神的代码以及实际的自测案例,终于得到答案,完整代码如下:
let n;
//第一步,消耗掉第一行代码,并且存储为n;
while(n = parseInt(readline())) {
    // 创建新数组arr;
    const arr = []
    //利用for循环,将接下来的每一组数组存入arr,长度为n;
    for(let i = 0; i < n; i ++) {
        arr[i] = readline().trim().split(' ').map(Number)
    }
    // 正好剩下一行存入method;
    const method = readline();
    //新建result用于push之后method中的元素。count初始为0;
    let result = [], count = 0 
    // 3. 遍历method
    for(let i = 0; i < method.length; i++) {
        //下面分三种情况讨论;
        //第一种情况遇到前括号——不处理,可以写continue,也可以不写;
        if(method[i] === '(') { 
             //continue;
        } 
        //第二种情况,遇到后括号时;
        else if(method[i] === ')') { 
            if (result.length >= 2) {
                //利用pop方法获取括号内的两个数值;
                const second = result.pop();
                const first = result.pop();
                //count += 新增的乘法计算量;
                count += first[0] * first[1] * second[1];
                //又将括号内两个矩阵的计算结果返回result
                result.push([first[0], second[1]]);
            }
        } 
        //第三种情况,遇到非括号元素时,正常push入result数组;
        else {
            // 通过字母的 ascii 值判断对应矩阵的顺序
            result.push(arr[method.charCodeAt(i) - 65]);
        }
    }
    //本质上,第二种情况已经将括号全部去除,并且按照正确顺序计算出了最终结果,同时得到最终count数值
    console.log(count);
}      


//最后本人的疑问,以下是原题中提供的用例,如果都是(A(((BC)D)E))甚至(A(BC))这种,以上代码完全没有问题,因为括号内始终只存在两个元素,
//但如果用例为(A(((BC)DE)FGH));这种情况,必然以上代码是行不通的,需要更周全的考量,一点儿个人的思考,有兴趣的朋友可以一起留言讨论。
/*
5
23 61
61 59
59 34
34 56
56 35
(A(((BC)D)E))
*/



全部评论

相关推荐

09-29 15:34
已编辑
北京航空航天大学 C++
做个有文化的流氓:结果是好的,过程不重要,而且你的offer太多了
软开人,秋招你打算投哪些...
点赞 评论 收藏
分享
迷茫的大四🐶:价格这么低都能满了?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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