#题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
#解题思路
求出每一个不重复的数组元素出现的次数,进行一个比较得到最大值,并与数组长度的一半进行比较,返回结果。
代码实现
# -*- coding:utf-8 -*-
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
length = len(numbers)
n = [] # 数字
num = [] # 数字的次数
for i in numbers:
if i not in n:
n.append(i)
num.append(1)
else:
num[n.index(i)] += 1
if max(num) <= length / 2:
return 0
else:
return n[num.index(max(num))]
基于python的collections模块的简洁代码
import collections
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
tmp = collections.Counter(numbers) # dict子类
x = len(numbers)/2
for k, v in tmp.items():
if v > x:
return k
return 0
collections模块
collections是Python内建的一个集合模块,提供了许多有用的集合类。
collections.Counter
Counter是一个简单的计数器,例如,统计字符出现的个数:
>>> from collections import Counter
>>> c = Counter()
>>> for ch in 'programming':
... c[ch] = c[ch] + 1
...
>>> c
Counter({'g': 2, 'm': 2, 'r': 2, 'a': 1, 'i': 1, 'o': 1, 'n': 1, 'p': 1})
Counter实际上也是dict的一个子类,上面的结果可以看出,字符’g’、‘m’、'r’各出现了两次,其他字符各出现了一次。
总结自collections-廖雪峰老师的网站
感觉collection貌似值得系统的了解一下,后面好好学习一下顺便总结一下。