问题描述
小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就能得到所要求的结果。