Codility每周一课:L8 Leader(8.1)
2019-01-28 本文已影响2人
AiFany
![](https://img.haomeiwen.com/i4734220/54b00c7b22b8dac9.png)
P8.1 EquiLeader
Find the index S such that the leaders of the sequences A[0], A[1], ..., A[S] and A[S + 1], A[S + 2], ..., A[N - 1] are the same.
-
P8.1 超频数索引
寻找使得A[0], A[1], ..., A[S]和A[S + 1], A[S + 2], ..., A[N - 1]的超频数相同的索引S
由N个整数组成的非空数组A。出现次数达到数组所有元素个数的一半以上的数为该数组的超频数。
超频数索引是一个索引S,其中0≤S<N−1,此索引将数组分为两个数组:A[0], A[1], ..., A[S]和A[S + 1], A[S + 2], ..., A[N - 1],并且这2个数组具有相同值的超频数。
例如,给定数组A:A[0]=4,A[1]=3,A[2]=4,A[3]=4,A[4]=4,A[5]=2
可找到两个超频数索引:
-
S=0,因为序列:(4)和(3、4、4、4、2)具有相同的超频数,其值为4。
-
S=2,因为序列:(4、3、4)和(4、4、2)具有相同的超频数,其值为4。
目标是计算超频数索引的数量。
编写函数:
def solution(A)
给定一个由N个整数组成的非空数组A,则返回超频数索引的数目。
例如,针对上面的例子,函数应该返回2。
假定:
-
N是区间[1,100000]内的整数;
-
数组A的每个元素都是区间[-1000000000,1000000000]内的整数。
- 解题思路
因为超频数肯定是唯一的。首先遍历数组,获得超频数以及它出现的次数。然后再次遍历数组,判断该超频数在已经遍历过、以及还未遍历过的序列中,是不是都是超频数,是的话,就超频数索引的个数加1。
- Python3代码
# -*- coding:utf-8 -*-
# &Author AnFany
# Lesson 8:Leader
# P 8.1 EquiLeader
def solution(A):
"""
返回数组A中的超频数索引的个数
:param A: 数组
:return: 返回超频数索引的个数
"""
leader_dict = {}
for i in A:
if i in leader_dict:
leader_dict[i] += 1
else:
leader_dict[i] = 1
# 确定超频数,以及出现的次数
leader, times = max(leader_dict.items(), key=lambda x: x[1])
equi_count = 0
count = 0 # 超频数已经出现的次数
length = len(A)
for index, value in enumerate(A):
if value == leader:
count += 1
if count > (index + 1) / 2 and (times - count) > (length - (index + 1)) / 2:
equi_count += 1
return equi_count
-
结果
image
点击获得更多编程练习题。欢迎Follow,感谢Star!!! 扫描关注微信公众号pythonfan,获取更多。