算法题,水王数的处理(python版)
Posted 韶光不负
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题,水王数的处理(python版)相关的知识,希望对你有一定的参考价值。
不及小步无以至千里,所以想要增强自己,只有不断练习。如果小编的文章对你有帮助,不要忘了关注加点赞哦!
目录
什么是水王数?
水王数:在一个列表当中出现次数超过总次数一半的数。
有什么用?
比如说美国的选举投票,总统想要一半以上的票,不然就重新进行选择投票。
解体思路!
题型:给定一个数列,请求出出现次数大于一半以上的数?要求:时间复杂度O(n),额外空间复杂度O(1)
1,首先我们需要2个变量,一个存储候选人(voters)一个统计候选人消除出现次数(hp)
2,逻辑思路:候选人出现次数大于所以其他数的总和,遍历数组,选取第一个个数为候选人,给定消除次数为1,当下一个数与候选人相同加1,(不同减1,并让下一个数当候选人),如此反复遍历到末尾的数,
#代码实现
for num in ls:
if hp == 0:#消除数后次数为0,创建候选
voters = num
hp = 1 #给它出现次数
elif voters != num: #如果数值与候选不一样-1
hp -= 1
else:#反之,相同加一
hp += 1
(有一种特殊情况,类似(1,2,3,4,5)用上面逻辑水王数就为5,但实际情况并不是,所以需要一个变量来统计一下候选人出现次数,当出现次数大于数组一半以上时,就确定是水王数)
#代码实现
cont = 0 # 出现次数
for i in ls:
if i==voters:
cont+=1
if cont>=len(ls)/2:
return voters
else:
return -1
完整代码:
'''
水王数的解决
作者:ls富
time:2021/6/4
'''
def witer_num(ls):
if len(ls)==0:
return -1
voters=0 #候选
hp=0 #出现消除后次数
for num in ls:
if hp == 0:#消除数后次数为0,创建候选
voters = num
hp = 1 #给它出现次数
elif voters != num: #如果数值与候选不一样-1
hp -= 1
else:#反之,相同加一
hp += 1
# 如果遍历完成后,没有候选
if hp == 0:
return -1
#有候选情况
cont = 0 # 出现次数
for i in ls:
if i==voters:
cont+=1
if cont>=len(ls)/2:
return voters
else:
return -1
if __name__ == '__main__':
ls=[3,2,3,3,3,4,5]
print(witer_num(ls))
以上是关于算法题,水王数的处理(python版)的主要内容,如果未能解决你的问题,请参考以下文章