E-字符统计重排(100p)
字符统计及重排
问题描述
给定一个只包含字母的字符串(不含空格),要求统计字符串中各个字母(区分大小写)出现的次数,并按照字母出现次数从大到小的顺序输出各个字母及其出现次数。
如果多个字母出现次数相同,则按照以下规则排序:
- 小写字母优先于大写字母
- 在全为小写或全为大写的情况下,按照字母的自然顺序(即ASCII码升序)排序
输入格式
输入为一行,包含一个仅由字母组成的字符串 (不含空格)。
输出格式
按照字母出现次数从大到小的顺序输出各个字母和字母次数,用英文分号分隔,注意末尾也需要加分号。每个字母及其出现次数的格式为"字母:次数",字母和次数间用英文冒号分隔。
样例输入1
xyxyXX
样例输出1
x:2;y:2;X:2;
样例输入2
abababb
样例输出2
b:4;a:3;
样例解释
样例1 | 每个字符出现的次数都是2,按照规则,小写字母x排在小写字母y之前,而小写字母都排在大写字母X之前 |
样例2 | b的出现次数(4次)比a多(3次),所以b排在a之前 |
数据范围
- ,其中 表示字符串 的长度
题解
模拟+排序
-
统计字符出现次数: 首先,我们需要遍历整个字符串,统计每个字符出现的次数。这可以通过使用一个哈希表(在Python中可以用字典)来实现,键为字符,值为出现次数。
-
排序: 统计完成后,我们需要对这些字符按照出现次数和题目给定的规则进行排序。这里的关键是定义一个合适的排序规则。我们可以使用一个自定义的比较函数,该函数应考虑以下几点:
- 首先比较字符出现的次数,次数多的排在前面
- 如果次数相同,小写字母优先于大写字母
- 如果是同为小写或同为大写的字母,则按照ASCII码升序排列
-
输出结果: 排序完成后,我们只需要按照要求的格式输出结果即可。
这道题的难点在于排序规则的实现。我们可以使用编程语言提供的排序函数,并自定义比较规则。例如,在Python中,我们可以使用sorted()
函数的key
参数来实现自定义排序。
参考代码
以下是五种语言的实现,每种实现都附带了详细的注释:
- Python
from collections import Counter
import sys
def custom_sort(item):
char, count = item
# 返回一个元组作为排序的key
# (-count, char.isupper(), ord(char)) 表示:
# 1. 按照count的负值排序,这样count大的会排在前面
# 2. 大写字母(isupper()为True)会排在后面
# 3. 如果以上都相同,则按照字符的ASCII值排序
return (-count, char.isupper(), ord(char))
def main():
# 从标准输入读取字符串
s = sys.stdin.readline().strip()
# 使用Counter统计字符出现次数
char_count = Counter(s)
# 对字符进行自定义排序
sorted_chars = sorted(char_count.items(), key=custom_sort)
# 构建输出字符串
output = ';'.join(f"{char}:{count}" for char, count in sorted_chars) + ';'
# 输出结果
print(output)
if __name__ == "__main__":
main()
- C
// 待补充
- Javascript
// 自定义排序函数
function customSort(a, b) {
if (a.count !== b.count) {
return b.count - a.count; // 按出现次数降序排列
}
const isUpperA = a.char.toUpperCase() === a.char;
const isUpperB = b.char.toUpperCase() === b.char;
if (isUpperA !== isUpperB) {
return isUpperA ? 1 : -1; // 小写字母排在前面
}
return a.char.localeCompare(b.char); // 按字符的 ASCII 值升序排列
}
// 主函数
function main() {
const input = req
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
算法刷题笔记 文章被收录于专栏
本专栏收集并整理了一些刷题笔记