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结点是孤岛

posted @ 2024-04-12 19:51  沙滩炒花蛤  阅读(343)  评论(0编辑  收藏  举报