红包运气排行榜|青训营笔记

207 阅读2分钟

问题描述

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

题目分析

对所有参与抢红包的人进行一次运气排名。(注意:同一参与者可能会抽取多次红包)

排名标准:

1、抢红包的金额数。

2、抢红包的顺序。

思路

先统计所有人抢红包的金额数以及他们抢红包的先后,再按照规则进行排序。

代码

建立字典存储数据

为了统计所有人抢红包的金额数以及他们抢红包的先后顺序,我们创建一个字典,将他们的这些属性存储在字典里。

dict1={}
for i in range(n):
        if s[i] in dict1:
            dict1[s[i]][0]+=x[i]
            n-=1
        else:
            dict1[s[i]]=[x[i],i,0]

解释: x[i]:抢红包的金额数

i:抢红包的顺序(记录某个人第一次抢红包的顺序)

0:运气排名

根据规则对数据进行排序

建立完字典存储完数据后,我们需要按照规则对手气进行排序。因为字典是一个无序的结构,所以我们在字典里添加一个数据来记录排名

    s=list(set(s))
    for i in range(n-1):
        for j in range(i+1,n):
                if dict1[s[i]][0]>dict1[s[j]][0]:
                    dict1[s[j]][2]+=1
                elif dict1[s[i]][0]==dict1[s[j]][0]:
                    if dict1[s[i]][1]<dict1[s[j]][1]:
                        dict1[s[j]][2]+=1
                    else:
                        dict1[s[i]][2]+=1
                else:
                    dict1[s[i]][2]+=1

解释: s=list(set(s))通过把列表转成集合再转回列表的方式,达到删除s中相同的元素。(这是为了下面循环的时候不会多次循环同一个键)

因为数组越界,所以外层循环到n-1,接着dict1[s[i]]依次与从i+1开始到n结束的数比较大小,如果dict1[s[i]]小,排名相应的要-1。如果相同,再比较抢红包的顺序。通过这种方式实现各个数之间的比较,得出最后的排名。

将排序结果展示出来:

建立一个空列表,将字典的键按照第二步的排序顺序依次添加进去。

    result=[]
    for i in range(n):
        for j in dict1:
            if i==dict1[j][2]:
                result.append(j)

最终return result就能得到所要求的结果。