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