先看题目:
大致是找出a=[1,1,2,3,3,4,5,4,5]类似的列表中出现一次的元素>没错,就是2了。
1.先讲讲思路
2.源代码
3.这里面学习到的知识
1.思路1是这样的,我遍历原列表。每次都计算此刻的元素在列表中出现的次数(('')).当返回值是1时,结束。但是我发现这样的时间复杂度是O(n),的确,后面提交的时候也超时了。
思路2.利用Counter(X).most_common(n)函数,会直接返回从高频率出现的(频率,元素)到低频率的列表。这样我们只需要取最后那个就行了。但是我还是觉得有点浪费了,毕竟我只需要最后的一个信息。
2.源码:
from collections import Counter
zs = int(input())
for i in range(zs):
a = int(input()) # 这个牌组的个数
b = input().split() # 具体剩下的牌
c = Counter(b).most_common(a) # 次数排在前n的数c d e
d = list(c[-1])[0]
print("Case #%d:"%(i+1),d)
3.看了同学们的思路:
同学1:先排个序,变成[2,2,3,4,4,5,5]的样子;再去循环判断第一个元素与第二个是不是相等?
评价:仅仅对本题来说,思路很好。但是还是有点费时。
同学2: nums = [int(j) for j in input().split()] 这串代码,让我学会体面的讲字符的表格一行转换成int形的。
另外:在导入Counter的情况下:Counter(nums)可以以字典的形式返回这个列表的频率键值对。注:若字典前还有Counter,为了单纯字典化,可以dict(Counter(nums)).要知道,字典映射是极快的。比列表好太多。
同学3:set(),在把列表元素往集合里面添 new__contains__(x):