赞
踩
一个认为一切根源都是“自己不够强”的INTJ
个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数
目录
方法一:使用 collections.Counter 优化字符计数
题目链接:https://www.lanqiao.cn/problems/504/learning/?page=1&first_category_id=1&difficulty=20&sort=students_count&asc=0
- import os
- import sys
- word=input()
- char_counts={}
- for char in word:
- if char not in char_counts:
- char_counts[char]=1
- else:
- char_counts[char]+=1
-
-
- print(*sorted(char_counts.items(),key=lambda x:(-x[1],x[0]))[0],sep='\n',end='')
这部分代码首先将字典 char_counts 的键值对转换为列表,然后使用 sorted 函数按指定的规则排序。排序规则是先按出现次数的负值(即从高到低)排序,如果出现次数相同则按字符的字典序排序。最后,输出排序后的第一个元素(即出现次数最多的字符及其出现次数)。
综合来看,整个代码的时间复杂度主要由排序部分决定,因此总体时间复杂度为 O(n + m log m)。
综合来看,整个代码的空间复杂度为 O(m)。
这段代码在处理大量数据时可能会受到排序操作的影响,但总体来说,它在时间和空间效率上都是合理的。
当然,可以对这段代码进行优化。以下是几种可能的优化方式:
collections.Counter 可以快速计算字符出现的次数,并且它的构造器是经过优化的,性能优于手动构造字典。
- import collections
-
- word = input()
- char_counts = collections.Counter(word)
-
- # 按照出现次数从高到低排序,出现次数相同时按字符字典序排序
- most_common_char = sorted(char_counts.items(), key=lambda x: (-x[1], x[0]))[0]
-
- # 输出结果
- print(*most_common_char, sep='\n', end='')
对于寻找出现次数最多的字符,可以使用堆数据结构,这样可以优化排序操作。
- import collections
- import heapq
-
- word = input()
- char_counts = collections.Counter(word)
-
- # 使用堆来获取出现次数最多的字符
- most_common_char = heapq.nlargest(1, char_counts.items(), key=lambda x: (x[1], -ord(x[0])))[0]
-
- # 输出结果
- print(*most_common_char, sep='\n', end='')
在遍历字符串的过程中,手动维护一个最大值,这样可以避免对整个字典进行排序。
- word = input()
- char_counts = {}
- max_char = ''
- max_count = 0
-
- for char in word:
- if char not in char_counts:
- char_counts[char] = 1
- else:
- char_counts[char] += 1
-
- # 更新最大值
- if (char_counts[char] > max_count) or (char_counts[char] == max_count and char < max_char):
- max_count = char_counts[char]
- max_char = char
-
- # 输出结果
- print(max_char, max_count, sep='\n', end='')
可以根据具体需求选择适合的优化方案。
在代码优化过程中,可以应用一些哲学和编程思想来设计更高效、更可读的解决方案。以下是对上述方法中使用的哲学和编程思想的详细说明:
这些优化方法利用了多种哲学和编程思想,如开源工具复用、抽象化、数据结构选择、分而治之、原地计算和贪心算法。这些思想不仅帮助我们编写高效的代码,还提高了代码的可读性和可维护性。通过理解和应用这些思想,我们可以设计出更加优雅和高效的解决方案。
根据上述的哲学和编程思想,以下是一些具体的技巧,可以帮助将这些原则应用到其他问题中:
记住,这些只是工具和方法,应用哪种取决于具体的问题和场景。在实际编程中,需要灵活运用,甚至需要综合利用多种技巧和思想来解决问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。