编程题#2:字符串中次数第2多的字母
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
输入一串长度不超过500个符号的字符串,输出在串中出现第2多的英语字母(大小写字母认为相同)和次数(如果串中有其它符号,则忽略不考虑)。如果有多个字母的次数都是第2多,则按串中字母出现的顺序输出第1个。
例 ab&dcAab&c9defgb
这里,a 和 b都出现3次,c和d都出现2次,e、f 和 g 各出现1次,其中的符号&和9均忽略不考虑。因此,出现第2多的应该是 c 和 d,但是 d 开始出现的位置在 c 的前面,因此,输出为
D+d:2
(假定在字符串中,次数第2多的字母总存在)
输入
一个字符串
输出
大写字母+小写字母:个数
样例输入
ab&dcAab&c9defgb
样例输出
D+d:2
1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 5 struct charandnum { 6 char ch; 7 int count; 8 }; 9 int main() { 10 struct charandnum s[501], max, second; 11 char a[501]; 12 cin>>a; 13 int i, j, l = 0; 14 for (i = 0; a[i] != ‘\0‘; i++) { 15 if ((a[i] >= ‘A‘ && a[i] <= ‘Z‘) || (a[i] >= ‘a‘ && a[i] <= ‘z‘)) { 16 char temp; 17 if (a[i] >= ‘a‘) 18 temp = a[i] - 32; 19 else 20 temp = a[i]; 21 bool found = false; 22 for (j = 0; j< l; j++) { 23 if (s[j].ch == temp) { 24 s[j].count++; 25 found = true; 26 } 27 } 28 if (!found) { 29 s[l].ch = temp; 30 s[l].count = 1; 31 l++; 32 } 33 } 34 } 35 max = s[0]; 36 bool foundSecond = false; 37 i = 0; 38 while (!foundSecond) { 39 if (s[i].count > max.count) { 40 second = max; 41 max = s[i]; 42 foundSecond = true; 43 } 44 else if (s[i].count < max.count) { 45 second = s[i]; 46 foundSecond = true; 47 } 48 i++; 49 } 50 for (i; i<l - 1; i++) { 51 if (s[i].count > max.count) { 52 second = max; 53 max = s[i]; 54 } else if (s[i].count < max.count && s[i].count > second.count) { 55 second = s[i]; 56 } 57 } 58 printf("%c+%c:%d\n", second.ch, (char)(second.ch + 32), second.count); 59 return 0; 60 }
时间: 2024-10-05 04:19:17