算法题目
在实际的文本处理场景中,我们常常需要对文本中的字符进行统计分析。现在有这样一个任务:给出一个仅由字母组成且不包含空格的字符串,我们要统计该字符串中各个字母(区分大小写)出现的次数。然后,按照字母出现次数从大到小的顺序,输出各个字母及其出现的次数。若字母出现的次数相同,则按照自然顺序排序,并且要保证小写字母排在大写字母之前。
输入要求:输入为一行仅包含字母的字符串。
输出要求:按照字母出现次数从大到小的顺序,输出各个字母和其出现的次数,字母和次数之间用英文冒号分隔,各字母及其次数之间用英文分号分隔,注意输出的末尾也要有分号。
示例如下:
示例一:
输入:
xyxyXX
输出:
x:2;y:2;X:2;
说明:在这个字符串中,每个字符出现的次数都是2。按照规则,x
排在y
之前,而小写字母x
又排在大写字母X
之前。
示例二:
输入:
abababb
输出:
b:4;a:3;
说明:在该字符串中,b
的出现次数比a
多,所以b
排在a
前面。
解题思路
为了解决这个问题,我们可以采用以下步骤:
- 首先,我们要使用
Counter
这个工具来建立一个字符频次字典char_counter
。在这个字典中,key
代表字符串中的每个字符,value
则表示该字符出现的次数。Counter
可以帮助我们快速且方便地统计每个字符的出现频次。例如,对于字符串"abababb"
,使用Counter
后,我们会得到一个类似{'b': 4, 'a': 3}
的字典。 - 接下来,我们需要对这个字符频次字典进行排序。排序的规则是按照字母出现次数从大到小排列,如果出现次数相等,就按照自然顺序排序,并且要保证小写字母排在大写字母之前。我们可以使用
sorted
函数,并通过自定义的key
函数来实现这个排序规则。key=lambda x: (-x[1], x[0].isupper())
这个表达式中,-x[1]
表示按照出现次数从大到小排序,x[0].isupper()
用于处理大小写字母的排序问题。 - 排序完成后,我们会得到一个包含每个字符及其出现次数的元组列表。我们将这些信息依次取出,存入一个结果字符串中。
- 最后,返回这个结果字符串。
示例代码
from collections import Counter
def solve_method(line):
# 使用Counter计算每个字符的出现次数
char_counter = Counter(line)
# 按字母出现次数从大到小,如果相等,按照自然顺序排序,小写字母在前,大写字母在后
char_count_pairs = sorted(char_counter.items(), key=lambda x: (-x[1], x[0].isupper()))
result = ""
for char, count in char_count_pairs:
# 每个字符及其出现次数
result += f"{char}:{count};"
return result
if __name__ == "__main__":
assert solve_method("xyxyXX") == "x:2;y:2;X:2;"
assert solve_method("abababb") == "b:4;a:3;"
这段代码首先导入了Counter
类,用于统计字符出现的频次。在solve_method
函数中,使用Counter
对输入的字符串进行处理,得到字符频次字典。然后,使用sorted
函数对字典的项进行排序,排序规则如解题思路中所述。最后,遍历排序后的列表,将每个字符及其出现次数按照要求的格式添加到结果字符串中并返回。在if __name__ == "__main__":
部分,我们使用了两个测试用例来验证函数的正确性。