解题思路:
一)哈希
使用哈希表来计算每个数的个数,然后返回相同数的个数判断是否满足要求
ls = [] #结果
lt = {}
for i in nums:
lt[i] = lt.get(i,0)+1 #计数
for i,j in lt.items():
if lt[i] > len(nums)/3: #判断
ls.append(i)
return ls
二)摩尔投票
因为要选大于总长1/3的数,那么最多存在两个数满足要求,若要选大于总长1/n的数,那么最多存在n-1个数满足要求
这里最多两个满足,设置两个变量存储遍历到的值,若遍历到的值在这两个变量中,对应计数增加1,否则都减1,若有一个数的计数为零则换一个数存储,最后剩下的是保留到最后的值,但还要计算他俩的个数并判断个数是否满足要求。
ls = [] #保存最终结果
temp1 = 0
temp2 = 0 #保存元素
count1 = 0 #计数器
count2 = 0
for i in range(len(nums)): #遍历列表
if (temp1 == nums[i]): #遇到相同值加1,下一个
count1 += 1
continue
elif (temp2 == nums[i]):
count2 += 1
continue
elif count1 == 0:
temp1 = nums[i] #该值库存为0换新值
count1 += 1
continue
elif count2 == 0:
temp2 = nums[i]
count2 += 1
continue
else:
count1 -= 1 #遇到保存的数之外的,个数都减一
count2 -= 1
count1 = 0 #计算个数
count2 = 0
for i in range(len(nums)):
if temp1 == nums[i]:
count1 += 1
elif temp2 == nums[i]:
count2 += 1
if count1>len(nums)/3: #将符合结果的加入最终结果
ls.append(temp1)
if count2>len(nums)/3:
ls.append(temp2)
return ls