面试题:已知数组中有一个数字出现的次数,超过数组长度的一半,要求找出这个数字。

已知数组中有一个数字出现的次数,超过数组长度的一半,要求找出这个数字。

题目来源:笔试面试题目:阿里选班长

三种方法python实现:

1、排序:

由于目标元素的次数超过数组长度的一半,所以排序后直接取中间元素就行。
python sorted函数采用的是Timsort排序,最坏时间复杂度为:O(nlogn),空间复杂度为:O(n)

python代码:

l = [6,2,5,4,2,2,2,2,5]
n = len(l)
print(sorted(l)[int(n/2)])

2、计数统计

将出现次数多于一半的元素取出来

python代码:

l = [6,2,5,4,2,2,2,2,5]
for i in set(l):
    if l.count(i)>len(l)/2:
        print(i)

3、摩尔投票

摩尔投票算法是基于这个事实:每次从序列里选择两个不相同的数字删除掉(或称为“抵消”),最后剩下一个数字或几个相同的数字,就是出现次数大于总数一半的那个。

例如:玩一个诸侯争霸的游戏,假设你方人口超过总人口一半以上,而且不能内斗,每个人口出去干仗都恰好能一对一同归于尽,最后还有人活下来的国家就是胜利。
最差的情况是所有人都联合起来对付你,你人数多于一半,最后肯定是你赢,或者其他国家也会相互攻击,最后肯定还是你赢。

python代码:

l = [6,2,5,4,2,2,2,2,5]
array = []
for i in l:
    if len(array)>0:
        if array[0]==i:
            array.append(i)
        else:
            array.pop()  
    else:
        array.append(i)
print(array[0])   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kaili_ya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值