Codility每周一课:L4 Counting Elements(P4.4)

4734220-cc5fff3d0deb569e.png
0.png
P4.4 MaxCounters

Calculate the values of counters after applying all alternating operations: increase counter by 1; set value of all counters to current maximum.

  • P4.4 最大计数器
    所有运算完成后计算计数器的值。运算包括计数器加一以及所有计数器均设置为最大值

有N个计数器,最初设置为0,并且有两个运算:
1. 增加(X):计数器X增加1;
2. 最大计数器:所有的计数器均设置为N个计数器中的最大值;

给定一个M个整数组成的非空数组A。此数组表示连续操作:
如果A[k]=X,并且1≤X≤N,则执行运算增加(X);
如果A[k]=N+1,则执行运算最大计数器。

例如,给定整数N=5,数组A:A[0]=3,A[1]=4,A[2]=4,A[3]=6,A[4]=1,A[5]=4,A[6]=4,每次连续操作后的计数器值为:
A[0]=3 ----->(0, 0, 1, 0, 0)
A[1]=4 ----->(0, 0, 1, 1, 0)
A[2]=4 ----->(0, 0, 1, 2, 0)
A[3]=6 ----->(2, 2, 2, 2, 2)
A[4]=1 ----->(3, 2, 2, 2, 2)
A[5]=4 ----->(3, 2, 2, 3, 2)
A[6]=4 ----->(3, 2, 2, 4, 2)
在所有操作之后给出每个计数器的值。

编写函数:

def solution(N, A)

给定一个整数N和一个由M个整数组成的非空数组A,返回一个表示计数器值的整数序列。

例如,针对上面的例子,函数应返回[3,2,2,4,2]。
假定:

  1. N和M是区间[1,100000]内的整数;
  2. 数组A的每个元素都是区间[1,N+1]内的整数。
  • 解题思路
    计算每两个最大计数器运算之间出现的最大次数,然后再加上最后一次最大数运算至数组结尾各个元素出现的次数。
  • Python3代码
# -*- coding:utf-8 -*-
# &Author  AnFany
# Lesson 4:Counting Elements
# P 4.4 MaxCounters


def solution_direct(N, A):
    """
    按照数组A中数字代表的规则,返回N个计数器的值序列,时间复杂度O(N*M)
    :param N: 计数器的个数
    :param A: 数组
    :return: 计数器值序列
    """
    counters_list = [0] * N
    for i in A:
        if i == N + 1:
            counters_list = [max(counters_list)] * N
        else:
            counters_list[i-1] += 1
    return counters_list

def solution_bad(N, A):
    """
    按照数组A中数字代表的规则,返回N个计数器的值序列,时间复杂度O(N*M)
    :param N: 计数器的个数
    :param A: 数组
    :return: 计数器值序列
    """
    sum_max = 0
    element_counter = {j: 0 for j in range(N)}
    for index, value in enumerate(A):
        if value != N+1:
            if value-1 in element_counter:
                element_counter[value-1] += 1
            else:
                element_counter[value-1] = 1
        else:
            sum_max += max(element_counter.items(), key=lambda x: x[1])[1]
            element_counter = {j: 0 for j in range(N)}
    return [element_counter[j]+sum_max if j in element_counter else sum_max for j in range(N)]


def solution(N, A):
    """
    按照数组A中数字代表的规则,返回N个计数器的值序列,时间复杂度O(N+M)
    :param N: 计数器的个数
    :param A: 数组
    :return: 计数器值序列
    """
    sum_max = 0
    element_counter = {}
    for index, value in enumerate(A):
        if value != N+1:
            if value-1 in element_counter:
                element_counter[value-1] += 1
            else:
                element_counter[value-1] = 1
        else:
            try:
                sum_max += max(element_counter.items(), key=lambda x: x[1])[1]
            except ValueError:
                sum_max += 0
            element_counter = {}
    return [element_counter[j]+sum_max if j in element_counter else sum_max for j in range(N)]
  • 结果
    4734220-11445e5fdeae901c
    image

点击获得更多编程练习题。欢迎Follow,感谢Star!!! 扫描关注微信公众号pythonfan,获取更多。

4734220-3a38d3c2af6073bb
image
4734220-28f0bd9ed8f73937
image

猜你喜欢

转载自blog.csdn.net/weixin_34209851/article/details/86815327