问题描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
解题思路
法一:
调包collections
法二:
遇到不同的数字则相互抵消,最后剩下的就是重复超过一半的数字
法三:
用字典(键值对)实现。键存放数组中出现的数字,值存放对应数字出现的次数。
import collections
class solution():
def MoreThanHalfNum_1(self,numbers):
#法1
tem = collections.Counter(numbers)
l=len(numbers)/2
for k,v in tem.items():
if v>l:
return k
return 0
def MoreThanHalfNum_2(self,numbers):
#法二:遇到不同的数字则相互抵消,最后剩下的就是重复超过一半的数字
cur_num=numbers[0]
count=1
for n in numbers:
if n == cur_num or count==0 :
count+=1
cur_num=n
else:
count-=1
if count>0:
count=0
for n in numbers:
if n==cur_num:
count+=1
return cur_num if count*2>len(numbers) else 0
return 0
def MoreThanHalfNum_3(self,numbers):
#法三:字典实现
dict={}
for num in numbers:
dict[num]=1 if num not in dict else dict[num]+1
if dict[num]>len(numbers)/2:
return num
if __name__=="__main__":
s=solution()
print(s.MoreThanHalfNum_3([1,2,3,2,2,2,5,4,2]))
# print(s.MoreThanHalfNum_2([1,2,3,5,4]))