题解 | #矩阵乘法计算量估算#
矩阵乘法计算量估算
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))
*/
查看5道真题和解析