水王以及扩展

这篇博客探讨了如何在论坛数据中快速找出发帖最频繁的用户,即所谓的“水王”。通过提供一系列的Python函数实现,文章解释了如何通过一次遍历来确定发帖超过一半的用户,以及在水王发帖数占总数一半时的特殊情况。此外,还扩展到如果有多个用户发帖量超过总数四分之一的情况,如何找出这些高活跃用户。
摘要由CSDN通过智能技术生成

水王

Tango是微软亚洲研究院的一个试验项目。
研究院的员工和实习生们都很喜欢在·Tango 上面交流灌水。
传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。
坊间风闻该“水王”发帖数氐 超过了帖子总数的一半 如果你有一个当前论坛上所有帖子(包括回帖)的列表,
其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?

def solve(arr):
    '''
    思路:
    利用一步一抵消,如果当前数和candidate相同,数量加一,如果不是就减一,相互抵消,因为水王发了超过一半的帖子,最后的candidate肯定是水王,
    
    '''
    candidate=arr[0]#候选数
    nTimes=0#抵消次数
    for i in range(1,len(arr)):
        if(nTimes==0):#两两消除为0,把当前值为候选
            candidate=arr[i]
            nTimes=1
            continue
        if(arr[i]==candidate):
            nTimes+=1
        else:
            nTimes-=1
    return candidate
#print(solve([1,2,2,2,2,2,3,2,6,4,2,2,7]))

扩展:水王占总数的一半

def solve1(arr):
    '''
    * 水王占总数的一半,说明总数为偶数
	 * 水王不失一般性,假设隔一个数就是水王的id,两两不同最后一定会消减为0
	 * 水王可能是最后一个元素,每次扫描的时候,多一个动作,与最后一个元素进行比较,单独计数,若恰好为数量的一半,则为水王
	 * 如果不是,计数不足一半,那么去掉最后一个元素,水王就是candidate
    '''
    candidate=arr[0]#候选数
    nTimes=0#抵消次数
    countoflast=0#记录出现的最后一个元素
    for i in range(1,len(arr)):
        if(arr[i]==arr[len(arr)-1]):
            countoflast+=1
        if(nTimes==0):#两两消除为0,把当前值为候选
            candidate=arr[i]
            nTimes=1
            continue
        if(arr[i]==candidate):
            nTimes+=1
        else:
            nTimes-=1
        #print(candidate,nTimes)
    if(countoflast==len(arr)/2):
        return arr[len(arr)-1]
    else:
        return candidate
#print(solve1([1,2,3,2,2,4]))

扩展2

超级水王没有了,统计结果表明有三个发帖很多的id,发帖的数目均超过了总数目的1/4 , 您让快速的找到他们的id么?

def solve2(arr):
    result={}
    for i in range(len(arr)):
        if arr[i] not in result.keys():
            result[arr[i]]=1
        else:
            result[arr[i]]+=1
    for index,value in result.items():
        if(value>int(len(arr)/4)):
            print(index)
#solve2([1,1,1,1,2,2,2,2,3,3,3,3,4])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lonota_zyx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值