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

package main

import (
	"fmt"
)

type Matrix2 struct {
	X int
	Y int
	Z int
}

type Stack2 []Matrix2

func (s *Stack2) Push(item Matrix2) {
	*s = append(*s, item)
}

func (s *Stack2) Pop() Matrix2 {
	if len(*s) == 0 {
		panic("can not pop stack!")
	}

	r := (*s)[len(*s)-1]
	*s = (*s)[:len(*s)-1]
	return r
}

func (s *Stack2) Len() int {
	return len(*s)
}

func main() {
	var n int
	_, _ = fmt.Scan(&n)

	mMap := map[byte]Matrix2{}
	for i := 0; i < n; i++ {
		var x, y int
		_, _ = fmt.Scan(&x, &y)

		mMap[(byte)('A'+i)] = Matrix2{X: x, Y: y, Z: 0}
	}

	// fmt.Printf("mMap: %#v\n", mMap)

	var expr string
	fmt.Scan(&expr)

	// fmt.Printf("expr: %#v\n", expr)

	mStack := Stack2{}
	for _, b := range []byte(expr) {
		if b == ')' {
			p1 := mStack.Pop()
			p0 := mStack.Pop()

			newMatric := Matrix2{X: p0.X, Y: p1.Y, Z: (p0.Z + p1.Z + p0.X*p0.Y*p1.Y)}
			// fmt.Printf("newMatric: %#v\n", newMatric)
			mStack.Push(newMatric)
		} else if b != '(' {
			mStack.Push(mMap[b])
			// fmt.Printf("PUSH: %#v\n", mStack)
		}
	}

	// fmt.Printf("mStack: %#v\n", mStack)

	result := 0
	var leftM *Matrix2
	for {
		m := mStack.Pop()
		if leftM == nil {
			leftM = &m
			result += leftM.Z
			// fmt.Printf("result: %#v\n", result)
		} else {
			result += leftM.X*leftM.Y*m.Y + leftM.X + m.Z
		}

		if mStack.Len() == 0 {
			break
		}
	}

	fmt.Printf("%v\n", result)
}

全部评论

相关推荐

2024-12-21 20:59
已编辑
门头沟学院 Java
1.介绍最拿手的项目,背景等等2.项目是你自己完整实现的吗?3.stringbuilder和stringbuffer的区别?线程安全性?如何保证线程安全?(非安全,调用append方法。安全,底层用了锁)4.synchronized锁是怎么实现的?加在方法上吗?5.string是线程安全的吗?(线程安全,定义就不可改变)6.final关键字是修饰什么的?修饰类的时候可以被继承吗?修饰方法的时候呢?(变量,方法,类)(修饰方法可以被继承不能被重写,修饰类不可被继承)7.java序列化和反序列化讲一下?底层是怎么实现的?(jableio.serializable,objectinputsstreamserialversionuid了解吗?假如我序列化后修改了内容,反序列化还能成功吗?(可以的,这个是控制版本的)8.transient关键字了解吗?(被这个关键字修饰的成员变量不会被序列化)9.异常和error讲一下?包括?throws关键字?(不想内部处理异常就抛出去)&nbsp;throw关键字呢?(主动抛出异常,发现异常,手动触发异常处理机制)10.redission实现了怎样的分布式锁?底层?(加锁原理,可重复,删除锁)(setnx以及lua脚本)锁的续期?看门狗机制?11.redis数据结构?set和sortedset区别讲一下?(多了个score用来排序)12.redis树怎么实现的?(这个忘光了,没答出来)(跳跃表?字典?)不懂,求牛友告知13.redis淘汰策略有哪些?你项目用的是哪个?场景是?具体在哪个文件设置?14.mysql数据量有多少?你项目里面的?或者实习遇到的?15.mysql常用的优化策略?你讲一个优化的案例?你是怎么知道mysql执行时间的?(说了网上查的命令行,好像是mysql日志)16.你还用过哪些数据库吗?17.索引的数据结构?B树和B+树的区别?还有最左索引匹配?18.MVCC机制怎么实现的?实现了什么事务隔离级别?(rc,rr)(rr是多次读数据都一样,rc是读到最新的)19.幻读了解吗?mvcc是怎么解决的?(判断完范围后,再通过版本号判断是否读取)还有其他吗?(间隙锁gap&nbsp;lock)20.实习做的什么?反问:业务,自研ai更新:等老板决定,会赢吗😭#牛客解忧铺# #牛客创作赏金赛#
查看44道真题和解析 牛客解忧铺 牛客创作赏金赛
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务