Codility每周一课:P8.1 EquiLeader

Codility每周一课:P8.1 EquiLeader_第1张图片
8.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

例如,给定数组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。

假定:

  1. N是区间[1,100000]内的整数;

  2. 数组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,获取更多。

Codility每周一课:P8.1 EquiLeader_第2张图片
image
Codility每周一课:P8.1 EquiLeader_第3张图片
image

你可能感兴趣的:(Codility每周一课:P8.1 EquiLeader)