python Counter以及Counter().most_common(n)的使用,美团周赛 2170. 使数组变成交替数组的最少操作数

该博客探讨了Python的collections.Counter类在统计列表中元素出现频率的应用。通过Counter.most_common()方法获取出现次数最多的元素,并进行比较,以确定在给定列表中进行最少操作次数的策略。文章中提供的代码示例展示了如何处理具有特定模式的列表,以找到需要最少操作次数的元素组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Counter()函数:Counter是dict子类,用于计数可哈希的对象。元素被作为字典的key存储,它们的计数作为字典的value存储
注意:Counter()函数返回的是字典
在这里插入图片描述
Counter().most_common([n]) 从多到少返回一个有前n多的元素的列表,即以[(元素1,次数),…,(元素n,次数)]返回出现次数前n的统计列表
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

class Solution:
    def minimumOperations(self, nums: List[int]) -> int:
        len_nums = len(nums)
        if len_nums<=1:
            return 0
        elif len_nums==2:
            return 0 if nums[0]!=nums[1] else 1
        elif nums.count(nums[0]) == len_nums:
            return len_nums//2
        # m是偶数次项的元素出现频率top2统计
        m = Counter(nums[::2]).most_common(2) # 利用Counter.most_common()取出次数最多的前两个元素[(元素1,次数),(元素2,次数)]
        # n是奇数次项的元素出现频率top2统计
        n = Counter(nums[1::2]).most_common(2)
        
        a_most,b_most = m[0],n[0] # 取出频率最高的那个元组(元素,次数)
        if a_most[0] == b_most[0]:
            # 如果其中一段只有一种元素,那么将长的一段向后取元素
            if len(m)> len(n):
                a_most=m[1]
            # 和上面的同理
            elif len(m)<len(n):
                b_most=n[1]
            # 如果第一段:[(元素1,次数),(元素2,次数)]、第二段:[(元素1,次数),(元素3,次数)]
            # 操作数最小需要对比每段top1元素出现次数与top2元素出现次数的差值,差值大表明需要做的操作多,即操作数大,所以要移动差值小的那段
            elif (m[0][1]-m[1][1]) > (n[0][1]-n[1][1]):
                b_most = n[1]
            else:
                a_most = m[1]
        # return剩下需要操作的次数(总长度-nums[::2]段不需要修改的次数-nums[1::2]不需要修改的次数)
        return len_nums - a_most[1] - b_most[1]
关于牛客网 Round 83 的具体题目和解答,目前并未提供直接的引用支持。然而,可以基于以往的经验以及类似的模式来推测可能涉及的内容结构。 通常情况下,牛客会包含多个不同难度级别的题目,从简单的签到题(A 类型)到较难的挑战性问题(E 或 F 类型)。以下是根据已有经验构建的一般框架: ### 牛客 Round 83 可能的主题 #### A - 签到题 这类题目通常是简单算法的应用或者基础逻辑判断。例如: ```python def solve_a(): n = int(input()) result = sum(range(1, n + 1)) # 计算前N项自然数之和 print(result) solve_a() ``` 此部分无需深入解析,主要考察参者的基础编程能力[^1]。 #### B - 中等难度题 此类题目可能会涉及到数组操作、字符串处理或基本数据结构应用。比如给定一段文字统计特定字符频率的问题。 ```python from collections import Counter def solve_b(): s = input().strip() counter = Counter(s) most_common_char, count = counter.most_common(1)[0] print(most_common_char, count) solve_b() ``` 上述代码片段展示了如何利用Python内置库快速解决常见计数类问题[^2]。 #### C/D/E/F 更高阶挑战 这些更复杂的任务往往需要运用高级技巧如动态规划(DP),图论(Graph Theory)或者其他专门领域知识才能有效完成。由于缺乏具体的Round 83资料,这里仅给出一个假设性的例子有关最短路径寻找: ```python import heapq INF = float('inf') def dijkstra(graph, start_node): distances = {node: INF for node in graph} distances[start_node] = 0 priority_queue = [(0, start_node)] while priority_queue: current_distance, current_vertex = heapq.heappop(priority_queue) if current_distance > distances[current_vertex]: continue for neighbor, weight in graph[current_vertex].items(): distance = current_distance + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(priority_queue, (distance, neighbor)) return distances graph_example = { 'A': {'B': 1, 'C': 4}, 'B': {'A': 1, 'C': 2, 'D': 5}, 'C': {'A': 4, 'B': 2, 'D': 1}, 'D': {'B': 5, 'C': 1} } print(dijkstra(graph_example, 'A')) ``` 这段程序实现了经典的迪杰斯特拉算法用于求解加权无向图中的单源最短路径问题[^3]. 尽管无法确切知道每道实际考题是什么样子,但通过以上介绍应该能够帮助理解一般竞形式下的潜在考点及其解决方案设计方法.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值