牛客刷题 | HJ68 成绩排序, HJ69 矩阵乘法,HJ70 矩阵乘法计算量估算

HJ68 成绩排序

题目链接
思路建立字典,key代表名字,value为数字,最后sorted函数按规定排序。注意名单中的名字会重名,所以key应该是名字加上编号,以免同名的分数被覆盖。将编号填充为3位数,方便最后输出名字的slice,即从第一位到倒数第三位,左闭右开。
代码

import sys

n, order = int(input()), input()
dic = dict()
for i in range(n):
    inf = input().split(' ')
    dic[inf[0] + str(i).zfill(3)] = int(inf[1])

if order == '0':
    for i in sorted(dic.items(), key = lambda x : x[1], reverse = True):
        print(i[0][:-3] + ' ' + str(i[1]))
else:
     for i in sorted(dic.items(), key = lambda x : x[1]):
        print(i[0][:-3] +' ' + str(i[1]))

HJ69 矩阵乘法

[题目链接](https://www.nowcoder.com/practice/ebe941260f8c4210aa8c17e99cbc663b?tpId=37&tqId=21292&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37&difficulty=undefined&judgeStatus=undefined&tags=&title=)
思路
根据输入得到矩阵A,B,再直接根据题目中的公式计算乘积。

import sys

x, y, z = int(input()), int(input()), int(input())
A = [[0] * y for _ in range(x)]
B = [[0] * z for _ in range(y)]
ans = [[0] * z for _ in range(x)]
for i in range(x):
    A[i] =[int(m) for m in input().split(' ')]
for i in range(y):
    B[i] = [int(m) for m in input().split(' ')]
for i in range(x):
    for j in range(z):
        cal = 0
        for k in range(y):
            cal += A[i][k] * B[k][j]
        ans[i][j] = cal
for i in range(x):
    out = [str(m) for m in ans[i]]
    print(' '.join(out))

HJ70 矩阵乘法计算量估算

思路:使用栈。遍历运算顺序,如果是左括号,跳过,如果是字母,就把字母对应的[行,列]写入栈中。如果遇到右括号,则弹出栈中最后两位,将乘法次数加入结果,把乘积得到的新矩阵的[行,列]加入栈。遍历结束后,如果栈中元素大于等于两个,就继续弹出两个,重复上述步骤,知道栈中只有一位元素。

代码

import sys

n = int(input())
lis = []
for i in range(n):
    lis.append(list(map(int, input().split())))
op = input()
stack = []
ans = 0
for x in op:
    if x.isalpha():
        stack.append(lis[ord(x) - ord('A')])
    elif x == ')' and len(stack) >=2:
        m2, m1 = stack.pop(), stack.pop()
        ans += m1[0] * m1[1] * m2[1]
        new = [m1[0], m2[1]]
        stack.append(new)
while len(stack) >= 2:
    m2, m1 = stack.pop(), stack.pop()
    ans += m1[0] * m1[1] * m2[1]
    new = [m1[0], m2[1]]
    stack.append(new)

print (ans)
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值