题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
解题思路
思路1
- 把代码量更短的代码放在前面,以裱门面…
- 用字典(键值对)实现。键存放数组中出现的数字,值存放对应数字出现的次数。
Python代码
def MoreThanHalfNum_Solution(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
return 0
思路2
定义一个计数器,如果数组中出现次数超过一半的数字,那么从左到右遍历一次后,计数器一定大于0。捕获这个使计数器大于0的数字,验证其出现次数是否超过数组长度的一半。
Python代码
def MoreThanHalfNum_Solution(self, numbers):
if not numbers:
return 0
checkNum = numbers[0]
count = 1
for n in numbers[1:]:
if n == checkNum or count == 0:
count += 1
checkNum = n
else:
count -= 1
# 验证部分
if count > 0:
count = 0
for n in numbers:
if n == checkNum:
count += 1
return checkNum if count*2>len(numbers) else 0
else:
return 0
当然也可以用如下形式,缩短点代码,但是稍微增长了程序的运行时间:
def MoreThanHalfNum_Solution(self, numbers):
if not numbers:
return 0
checkNum = numbers[0]
count = 1
for n in numbers[1:]:
if n == checkNum or count == 0:
count += 1
checkNum = n
else:
count -= 1
count = 0
for n in numbers:
if n == checkNum:
count += 1
return checkNum if count*2>len(numbers) else 0