题目:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路:
数组中有数字出现次数超过一半的数字,说明它出现的次数比其他数字出现的总和还要多。
因此设置两个变量,一个存储数字num,一个存储数字出现的次数cnt,然后挨个遍历。
如果后一个数字等于该数字num,那么次数cnt加1,
如果不相等,则次数cnt减1,
当次数cnt等于0的时,在下一个数字的时候重新复制新的数字以及出现的次数置为1,直到进行到最后,
最后,验证最后留下的数字是否出现次数超过一半,因为可能前面的次数依次抵消掉,最后一个数字就直接是保留下来的数字,但是出现次数不一定超过一半。
代码
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
# write code here
if numbers == []:
return 0
val, cnt = None, 0
for num in numbers:
if cnt == 0:
val, cnt = num, 1
else:
if val == num:
cnt += 1
else:
cnt -= 1
return val if numbers.count(val) * 2 > len(numbers) else 0