2024.4.10华为暑期实习笔试题解尝试1~2
题目在 4.10华为暑期实习笔试题解 努力开摆的小鱼 2024-04-10
T1
简单难度,按照题意顺着写就可以
n = int(input()) # 表示计费日志的条数
lst = [] # 去重后的日志
ss = set() # 为了去重
for i in range(n):
s = tuple(input().split(","))
t = s[0] + s[1] + s[2] # 时间+客户标识+计费因子
if s not in ss: # 同一客户同一计费因子在相同时间戳上,只保留第一次时间戳
lst.append(s)
ss.add(t)
fac = dict() # 计费因子:计费单价
m = int(input()) # 计费因子的数量
for i in range(m):
s = input().split(",")
fac[s[0]] = int(s[1])
val = dict() # 客户标识:费用
for i in lst:
if i[1] not in val: # 客户标识
val[i[1]] = 0 # 费用初始化为 0
# print(f"DEBUG user:{i[1]} fac:{i[2]} v:{fac[i[2]]} t:{i[3]}")
t = int(i[3])
if t < 0 or t > 100: # 计费时长不在范围内,当成0其实可以在输入时排除
t = 0
val[i[1]] += fac[i[2]] * t # 计费费用, 计费单价*计费时长
# 转存到list为了排序
ans = []
for i, j in val.items():
ans.append((i, j))
ans.sort(key=lambda x: x[0]) # 输出按客户标识字典序升序排序
for i in ans:
print(f"{i[0]},{i[1]}")
一个朋友输出没有排序,90分/100分
T2
怎么去查找AE之间的相似度传递关系呢?并查集是个什么玩意?于是去学习了一下
a = [] # 输入的相似度矩阵
n = int(input())
for r in range(n):
row = list(map(int, input().split()))
a.append(row)
# 根据相似度矩阵将五个元素划分为不同的集合,相似度大于0即代表两个元素属于统一集合
parent = list(range(n)) # 初始化并查集,每个元素都是不同的集合
# print(f"DEBUG parent:{parent}")
def find(x):
# 查找元素x所属的集合的根节点,并进行路径压缩
if x != parent[x]:
parent[x] = find(parent[x]) # 路径压缩
return parent[x]
similar = [0] * n # 记录每个集合的相似度总和
for r in range(n):
for c in range(n):
if a[r][c] != 0: # 相似度不为0
ix = find(r)
iy = find(c)
if ix != iy:
parent[iy] = ix
similar[r] += a[r][c] # 相似度累加
# print(f"DEBUG parent:{parent} similar:{similar}")
# 计算集合的数量
sf = set([find(i) for i in parent])
# print(f"DEBUG sf:{sf} sf.num:{len(sf)}") # 集合数量
# 计算每个集合的相似度之和
from collections import defaultdict
resd = defaultdict(int)
for s in sf:
for i in range(n):
if parent[i] == s:
resd[s] += similar[i]
# print(f"DEBUG resd:{resd.values()}") # 集合的相似度之和
ret = sorted(resd.values(), reverse=True)
# print(f"DEBUG ret:{ret}")
print(*ret)
T3
用例中,0结点是孤岛