找出一个字符串中出现次数最多的一个字符。
输入格式:
给出一个字符串,字符串的长度不大于10^6,不区分大小写, 字符串中可能包含'A'-'Z','a'-'z',' '字符。
输出格式:
分别输出出现最多次数的字符(如果为字母,输出小写字母),出现的次数,用一个空格分隔,如果有字符出现次数相同的输出较小的字符。行末尾无多余空格和换行
输入样例:
abcdefghijklmnopqrstuvwxyzA
输出样例:
a 2
给定一个字符串,我们需要找出其中出现次数最多的字符。字符串的长度不超过10^6,字符可以是大写字母、小写字母或空格。
首先,我们可以遍历字符串,统计每个字符出现的次数。为了不区分大小写,我们可以将所有字符转换为小写。我们可以使用一个字典来保存每个字符和它出现的次数。
然后,我们可以找出字典中出现次数最多的字符。如果有多个字符出现次数相同,我们选择较小的字符。
最后,我们将找到的字符和它的出现次数输出。
下面是详细的步骤:
- 初始化一个空字典
count_dict
,用于保存字符和对应的出现次数。 - 将输入的字符串转换为小写。
- 遍历字符串中的每个字符:
- 如果字符不是字母或空格,则跳过该字符。
- 如果字符已经在
count_dict
中,将该字符的出现次数加1。 - 如果字符不在
count_dict
中,将该字符添加到count_dict
,并将出现次数初始化为1。
- 找出
count_dict
中出现次数最多的字符和对应的次数。- 初始化变量
max_count
为0,用于保存最大的出现次数。 - 初始化变量
max_char
为一个空字符,用于保存出现最多次数的字符。 - 遍历
count_dict
中的每个键值对: - 如果当前键值对的值大于
max_count
,更新max_count
和max_char
。 - 如果当前键值对的值等于
max_count
,比较当前键值对的键和max_char
的大小,更新max_char
。
- 初始化变量
- 输出出现最多次数的字符(小写字母)和它的出现次数。
根据输入样例 "abcdefghijklmnopqrstuvwxyzA",我们可以执行上述步骤得到输出样例 "a 2"。
#include <stdio.h>
#include <ctype.h>
#define MAX_LENGTH 1000000
int main() {
char str[MAX_LENGTH];
int count[26] = {0};
int max_count = 0;
char max_char;
// 读取输入的字符串
fgets(str, sizeof(str), stdin);
// 统计每个字符出现的次数
for (int i = 0; str[i] != '\0'; i++) {
char c = tolower(str[i]);
if (isalpha(c) || c == ' ') {
count[c - 'a']++;
}
}
// 找出出现次数最多的字符
for (int i = 0; i < 26; i++) {
if (count[i] > max_count) {
max_count = count[i];
max_char = i + 'a';
} else if (count[i] == max_count && i + 'a' < max_char) {
max_char = i + 'a';
}
}
// 输出结果
printf("%c %d\n", max_char, max_count);
return 0;
}
请注意,上述代码假设输入的字符串长度不超过 MAX_LENGTH
的限制,并且忽略了字符串中的大写字母。如果需要处理更长的字符串或者考虑大写字母,可以根据实际需求进行调整。
tolower
是C语言标准库中的一个函数,位于 <ctype.h>
头文件中。它用于将字符转换为小写字母形式。
函数原型如下:
int tolower(int c);
tolower
函数接受一个整数参数 c
,表示要转换的字符。它返回一个整数,对应于将字符转换为小写字母后的 ASCII 值。
如果参数 c
是一个大写字母(A-Z),则返回相应的小写字母(a-z)的 ASCII 值。如果参数 c
不是大写字母,tolower
函数将保持参数不变。
在我们之前的代码示例中,我们使用 tolower
函数将输入字符串中的字符转换为小写字母形式,以便统一处理大小写字母。这样可以确保对于相同字母的不同大小写形式,我们可以将它们视为相同的字符进行统计。
例如,tolower('A')
的返回值是 'a'
的 ASCII 值。
isalpha
是C语言标准库中的一个函数,位于 <ctype.h>
头文件中。它用于检查一个字符是否是字母(大写或小写)。
函数原型如下:
int isalpha(int c);
isalpha
函数接受一个整数参数 c
,表示要检查的字符。它返回一个非零值(真)如果 c
是一个字母(A-Z 或 a-z),否则返回零(假)。
在我们之前的代码示例中,我们使用 isalpha
函数来过滤掉非字母字符,只统计出现在输入字符串中的字母和空格字符的次数。这样可以确保我们只计算有效的字符。
例如,isalpha('A')
的返回值是非零(真),因为 'A'
是一个大写字母。而 isalpha('1')
的返回值是零(假),因为 '1'
不是一个字母。
isalpha
函数还有其他类似的函数,如 isupper
(检查字符是否为大写字母)和 islower
(检查字符是否为小写字母),它们也位于 <ctype.h>
头文件中。这些函数可以帮助我们进行更多的字符类型检查和转换操作。