红包运气排行榜 | 豆包MarsCode AI刷题

87 阅读2分钟

题目内容

image.png

初次尝试

看到这题的样例,我一看直接上sort稳定排序就行

代码如下:
def solution(n: int, s: list, x: list) -> list:
    # 创建一个包含元组的列表,每个元组包含名字、金额和原始顺序
    participants = [(s[i], x[i], i) for i in range(n)]
    
    # 使用sorted函数进行排序,先按金额降序,再按原始顺序升序
    sorted_participants = sorted(participants, key=lambda p: (-p[1], p[2]))
    
    # 提取排序后的名字列表
    result = [p[0] for p in sorted_participants]
    
    return result

if __name__ == '__main__':
    print(solution(4, ["a", "b", "c", "d"], [1, 2, 2, 1]) == ['b', 'c', 'a', 'd'])
    print(solution(3, ["x", "y", "z"], [100, 200, 200]) == ['y', 'z', 'x'])
    print(solution(5, ["m", "n", "o", "p", "q"], [50, 50, 30, 30, 20]) == ['m', 'n', 'o', 'p', 'q'])

测试全过,结果一提交:

image.png

最坑人的来了,我是万万没想到红包还能重复抢,还可以累加金额,敢情还得记录一下用户名并统计它们所抢到红包总的金额。

再次尝试

class UserRedPacket:
    def __init__(self, name, amount):
        self.name = name
        self.amount = amount

def solution(n, s, x):
    # 创建用户红包列表
    user_red_packets = []
    # 创建一个字典记录用户名和对应的红包金额
    user_amount_map = {}

    # 遍历输入的用户名和红包金额
    for i in range(n):
        user_name = s[i]  # 获取当前用户名
        amount = x[i]     # 获取当前红包金额

        # 如果用户名已经存在,累加金额
        if user_name in user_amount_map:
            user_amount_map[user_name] += amount
        else:
            # 否则,添加新的用户名和金额
            user_amount_map[user_name] = amount
            user_red_packets.append(UserRedPacket(user_name, amount))

    # 更新用户红包列表中的金额
    for user in user_red_packets:
        user.amount = user_amount_map[user.name]

    # 根据红包金额进行稳定排序
    user_red_packets.sort(key=lambda a: (-a.amount, s.index(a.name)))

    # 提取排序后的用户名
    result = [user.name for user in user_red_packets]

    return result

这里我单独创了一个类(作为相应数据结构),用来标识用户(用户名+红包总金额) 排序还是循着第一次尝试的思路,先按金额逆序排列,金额相同再按原来次序排,直接利用python的lambda表达式作“谓词”即可实现。

运行结果

image.png

终于过了🤣