红包运气排行榜(样例有误)|豆包MarsCode AI刷题

134 阅读3分钟

1.问题

问题描述

小C参与了一场抢红包的游戏,现在他想要对所有参与抢红包的人进行一次运气排名。排名规则如下:抢到的金额越多,排名越靠前;如果两个人抢到的金额相同,则按照他们抢红包的顺序进行排名。比如,如果小C和小U抢到的金额相同,但小C比小U先抢,则小C排在小U前面。


测试样例

样例1:

输入:n = 4 ,s = ["a", "b", "c", "d"] ,x = [1, 2, 2, 1] 输出:['b', 'c', 'a', 'd']

样例2:

输入:n = 3 ,s = ["x", "y", "z"] ,x = [100, 200, 200] 输出:['y', 'z', 'x']

样例3:

输入:n = 5 ,s = ["m", "n", "o", "p", "q"] ,x = [50, 50, 30, 30, 20] 输出:['m', 'n', 'o', 'p', 'q']

2.思路

题目补充

  • n 表示参与抢红包的人数。
  • s 是一个长度为 n 的字符串列表,表示每个人的名字。
  • x 是一个长度为 n 的整数列表,表示每个人抢到的红包金额。

两者之间是一一对应的关系:s[i] 表示第 i 个人的名字,而 x[i] 表示该人抢到的红包金额。

样例1:

输入:n = 4 ,s = ["a", "b", "c", "d"] ,x = [1, 2, 2, 1] 输出:['b', 'c', 'a', 'd']

bcad


  1. 生成字典,s中的值为键,x中对应的值为值
  2. 对字典排序,先按值排序,值一样的话按先后顺序排序
  3. 定义结果数组
  4. 按序将字典的键加入结果数组

3.代码

import re

def solution(n: int, s: list, x: list) -> list:
    # write code here
    data = {}
    for i in range(len(s)):
        data[s[i]] = x[i]
    # 使用 enumerate 记录原始顺序
    sorted_items = sorted(data.items(), key=lambda item: (-item[1], list(data.keys()).index(item[0])))

    # 生成排序后的字典(如果需要)
    sorted_dict = dict(sorted_items)

    result = []
    for key in sorted_dict.keys():
        result.append(key)

    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'])

样例4有误

我们需要按照金额 X 的值进行排序,金额大的在前,金额相同时按照 S 的输入顺序排列。

排序逻辑

  1. 按金额从大到小排序。
  2. 如果金额相同,按原始顺序排序。

以下是详细的排序步骤:

  1. "aa" 抢到 17。
  2. "aaaaaaa" 抢到 14。
  3. "aaaa" 抢到 11。
  4. "aaaa" 抢到 2。
  5. "aaaa" 抢到 8。
  6. "aaaaaaaaaa" 抢到 16。
  7. "aaaaaaaaa" 抢到 14。
  8. "aaaa" 抢到 17。
  9. "aaaaaaaaaa" 抢到 10。
  10. "aaaaaaaaa" 抢到 6。
  11. "aaaaa" 抢到 5。
  12. "aaaa" 抢到 12。

按照金额从大到小排序并保留输入顺序:

  • 金额为 17 的有 "aa"(索引 0) 和 "aaaa"(索引 7),"aa" 在前。
  • 金额为 16 的是 "aaaaaaaaaa"(索引 5)。
  • 金额为 14 的有 "aaaaaaa"(索引 1) 和 "aaaaaaaaa"(索引 6),"aaaaaaa" 在前。
  • 金额为 12 的是 "aaaa"(索引 11)。
  • 金额为 11 的是 "aaaa"(索引 2)。
  • 金额为 10 的是 "aaaaaaaaaa"(索引 8)。
  • 金额为 8 的是 "aaaa"(索引 4)。
  • 金额为 6 的是 "aaaaaaaaa"(索引 9)。
  • 金额为 5 的是 "aaaaa"(索引 10)。
  • 金额为 2 的是 "aaaa"(索引 3)。

输出

最终结果的顺序为:

['aa', 'aaaa', 'aaaaaaaaaa', 'aaaaaaa', 'aaaaaaaaa', 'aaaa', 'aaaa', 'aaaaaaaaaa', 'aaaa', 'aaaaaaaaa', 'aaaaa', 'aaaa']