水王以及扩展

水王

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])

你可能感兴趣的:(笔记,算法,python)