给定一个长度不限的字符串,找出该字符串中出现次数最多的字符

字符串处理挑战:找出最频字符
本文介绍了一个关于字符串处理的编程挑战,任务是在给定的字符串中找到出现次数最多的字符,并考虑到大小写敏感或不敏感的情况。提供了Python和C++的实现代码,旨在帮助读者理解如何解决此类问题。

/*
时间限制 C/C++ 3s 其他 6s, 空间限制 C/C++ 32768k 其他 65535k

题目描述
    给定一个长度不限的字符串,请找出该字符串中出现次数最多的那个字符,并打印出该字符及其出现次数;
 如果多个字符的出 现次数相同,只打印首个字符;输出字符的大小写格式要与输 入保持一致,大小写不敏感模式下,
 输出字符的大小写格式与该 字符首次出现时的大小写格式一致。实现时无需考虑非法输。

输入描述
    输入为 字符串大小写敏感标记 其中"大小写敏感标记"为可选参数,取值范围为七yue|1fa1 se,txue表示大小写敏感;缺省取值txue
 例子: abcdabcde fa1e

输出描述
    输出:字符出现次数 如果出现次数最多的字符有多个,输出字典序最小的那个字 符。输出的字符都为小写字符
 例子: a 2
*/

Python实现

 1 str1 = input()
 2 str2 = str1.split(" ")
 3 sensitive = True
 4 if str2[1] == "false":
 5     sensitive = False
 6 maxCount = 0
 7 maxChar = "0"
 8 if sensitive:
 9     for c in str2[0]:
10         tmp = str2[0].count(c)
11         if tmp > maxCount:
12             maxCount = tmp
13             maxChar = c
14 else:
15     lc = str2[0].lower()
16     index = 0;
17     for c in lc:
18         tmp = lc.count(c)
19         if tmp > maxCount:
20             maxCount = tmp
21             maxChar = str2[0][index]
22         index += 1
23 print("%s %d" % (maxChar, maxCount))

 

C++实现,好像最终还有点问题。

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     char c[60000] = { 0 };
 7     char s[5] = { 0 };
 8     unsigned int count[52] = { 0 };
 9     char output[52] = { 0 };
10     memset(c, 0, 60000);
11     bool sensitive = true;
12     cin >> c;
13     cin >> s;
14     int i = 0;
15     int index = 0;
16     while ((i < 5) && (s[i] != 0))
17     {
18         if (strcmp(&s[i + 1], "true"))
19         {
20             sensitive = true;
21         }
22         else
23         {
24             sensitive = false;
25         }
26         break;
27 
28         i++;
29     }
30     int j = 0;
31     int max = 0, outputIndex = 0;
32     while ((j < 6000)&&(c[j]!=0))
33     {
34         if (sensitive)
35         {
36             if (90 < c[j])
37             {
38                 index = c[j] - 'A';
39                 count[index]++;
40                 if (output[index] == 0)
41                 {
42                     output[index] = c[j];
43                 }
44                 if (max < count[index])
45                 {
46                     max = count[index];
47                     outputIndex = index;
48                 }
49             }
50             else
51             {
52                 index = c[j] - 'a';
53                 count[index + 26]++;
54                 if (output[index + 26] == 0)
55                 {
56                     output[index + 26] = c[j];
57                 }
58                 if (max < count[index + 26])
59                 {
60                     max = count[index + 26];
61                     outputIndex = index + 26;
62                 }
63             }
64         }
65         else
66         {
67             if (90 < c[j])
68             {
69                 index = c[j] - 'A';
70             }
71             else
72             {
73                 index = c[j] - 'a';
74             }
75             count[index]++;
76             if (output[index] == 0)
77             {
78                 output[index] = c[j];
79             }
80             if (max < count[index])
81             {
82                 max = count[index];
83                 outputIndex = index;
84             }
85         }
86         j++;
87     }
88     cout << output[outputIndex] << " " << max << endl;
89     system("pause");
90     return 0;
91 }

 


 

注意编译器不兼容的问题

 

转载于:https://www.cnblogs.com/UFO-blogs/p/8525839.html

<think>嗯,用户现在想用C语言比较三个字符串的大小,然后输出最大的那个。根据之前的对话,我之前帮他实现了筛选以A开头的字符串,现在需要处理字符串比较的问题。 先看看用户提供的引用内容。引用[1]中的代码比较三个字符串并排序输出,用的是strcmp和交换函数。引用[2]提到比较字符串是从第一个字符开始比较ASCII值,直到分出大小或到达结尾。引用[3]是关于三个整数比较最大值的例子,但用户需要的是字符串。引用[4]讲的是输入输出函数,可能需要注意字符串输入的问题。 用户现在的问题是比较三个字符串输出最大者,而是排序。所以需要找到最大的那个字符串,而是按顺序排列。根据引用[1]中的方法,可以使用strcmp函数逐个比较。比如先比较前两个,找出较大的,再和第三个比较,得到最大的。 要注意字符串的输入方式。之前的代码里用户用了scanf("%s%s%s",a,b,c),但这样无法处理带空格的字符串,比如如果有输入是"hello world",会被截断成两个字符串用户的问题可能只需要处理含空格的单个单词,所以暂时可以继续使用scanf。但需要提醒用户注意这一点,或者改用fgets并处理换行符。 另外,动态分配内存可能更安全,但用户提供的示例中使用的是固定大小的数组,比如char a[15]。所以为了简单起见,可以先使用固定数组,但要注意缓冲区溢出的问题,比如输入超过15个字符的话,会导致问题。可以建议使用更安全的输入方式,比如限制输入的字符数,或者在scanf中使用%14s来限制长度。 然后是比较逻辑。需要先比较前两个字符串,把较大的存为当前最大值,再与第三个比较。可以使用strcmp函数,返回值为正数表示前者大,负数后者大,0相等。所以如果strcmp(str1, str2) > 0,说明str1更大。然后比较当前最大值和第三个字符串,确定最终的最大值。 在代码结构上,可以定义三个字符数组,输入三个字符串,然后通过比较确定最大者。例如: char str1[100], str2[100], str3[100]; scanf("%s%s%s", str1, str2, str3); char *max = str1; if (strcmp(str2, max) > 0) max = str2; if (strcmp(str3, max) > 0) max = str3; printf("最大字符串:%s\n", max); 但需要考虑输入的安全性和错误处理,比如输入的字符串长度是否超过数组大小。另外,是否需要处理大小写?比如用户是否希望"A"和"a"被视为相同。如果需要,就按ASCII值比较,否则需要先转换为统一大小写。 用户之前的代码示例中使用的是静态数组,但可能更安全的方式是使用动态分配或者限制输入的字符数。例如,使用scanf("%99s", str1)来限制输入超过99个字符,避免溢出。 另外,用户之前的回答中提到了使用fgets来读取包含空格的字符串,但当前问题可能需要处理空格。需要确认用户的需求,但根据问题描述,样例输入是三个以空格分隔的字符串,所以使用scanf是可行的,但需要明确说明无法处理带空格的情况,或者提供两种方法。 最后,输出最大的字符串,需要确保比较正确。比如在引用[1]中的方法是交换字符串,但这里只需要记录最大值的指针即可,需要修改原字符串。 总结步骤: 1. 输入三个字符串,使用安全的输入方法避免溢出。 2. 使用strcmp比较字符串,确定最大值。 3. 输出最大值。 需要注意的问题: - 输入缓冲区溢出:限制输入的字符数。 - 字符串比较的正确性:确保使用strcmp的返回值判断。 - 处理可能的错误输入,比如空字符串。 可能还需要添加错误处理,比如检查输入是否成功,或者字符串是否有效。但根据问题描述,可能需要太复杂,保持代码简洁。 所以,最终的代码示例应该包括输入三个字符串,比较并输出最大的那个,使用strcmp,并注意输入的安全性。同时,需要解释关键点,比如strcmp的使用,输入方法的选择,以及可能的改进点,比如动态内存分配或处理带空格的字符串。</think>### C语言实现比较三个字符串输出最大者 #### 分步实现方法 ```c #include <stdio.h> #include <string.h> #define MAX_LEN 100 // 单字符串最大长度 int main() { char str1[MAX_LEN], str2[MAX_LEN], str3[MAX_LEN]; char* max_str; // 指向最大字符串的指针 // 输入三个字符串含空格) printf("输入三个字符串(以空格分隔):"); scanf("%99s %99s %99s", str1, str2, str3); // 限制输入长度[^1] // 比较逻辑 max_str = str1; // 初始化假设str1最大 if (strcmp(str2, max_str) > 0) max_str = str2; // 比较str2与当前最大值[^2] if (strcmp(str3, max_str) > 0) max_str = str3; // 比较str3与当前最大值 // 输出结果 printf("最大字符串:%s\n", max_str); return 0; } ``` --- ### 关键点解析 1. **输入安全** - `%99s`格式控制符限制输入长度,防止缓冲区溢出 - 若需要支持含空格的字符串(如`"New York"`),需改用`fgets`: ```c fgets(str1, MAX_LEN, stdin); str1[strcspn(str1, "\n")] = '\0'; // 去除换行符 ``` 2. **字符串比较逻辑** - `strcmp(s1, s2)`返回值: - `>0`:s1字典序大于s2 - `=0`:字符串相等 - `<0`:s1字典序小于s2[^2] - 通过指针切换实现高效比较,避免内存复制 3. **大小写敏感** 默认区分大小写(`"Apple" < "apple"`),如需敏感比较: ```c #include <ctype.h> int cmp = strcasecmp(s1, s2); // 跨平台可用替代方案 ``` --- ### 扩展改进建议 1. **动态内存分配** ```c char* str1 = malloc(MAX_LEN * sizeof(char)); fgets(str1, MAX_LEN, stdin); // 使用后记得free(str1) ``` 2. **支持任意数量字符串** ```c char* strings[] = {str1, str2, str3}; for(int i=1; i<3; i++) { if(strcmp(strings[i], max_str) > 0) max_str = strings[i]; } ``` 3. **错误处理** ```c if(scanf("%99s%99s%99s", str1, str2, str3) != 3) { printf("输入格式错误"); return 1; } ``` --- ### 常见问题解答 **Q1 为什么`strcmp`认为"Apple"比"app"小?** ASCII码中大写字母(A-Z: 65-90)小于小写字母(a-z: 97-122)[^2],若需忽略大小写,可使用`strcasecmp`(Linux)或自定义比较函数。 **Q2 如何处理中文字符串比较?** 需使用宽字符`wchar_t`和`wcscmp`函数,并设置本地化: ```c #include <locale.h> #include <wchar.h> setlocale(LC_ALL, "zh_CN.UTF-8"); wchar_t ws1[MAX_LEN]; fgetws(ws1, MAX_LEN, stdin); ``` **Q3 输入含特殊符号(如逗号)怎么办?** 使用正则表达式限定输入范围(需`%[^ ]`格式): ```c scanf("%99[^ ,] %99[^ ,] %99[^ ,]", str1, str2, str3); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值