编程题#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

 #include<stdio.h>
#include<iostream>
using namespace std; struct charandnum {
char ch;
int count;
};
int main() {
struct charandnum s[], max, second;
char a[];
cin>>a;
int i, j, l = ;
for (i = ; a[i] != '\0'; i++) {
if ((a[i] >= 'A' && a[i] <= 'Z') || (a[i] >= 'a' && a[i] <= 'z')) {
char temp;
if (a[i] >= 'a')
temp = a[i] - ;
else
temp = a[i];
bool found = false;
for (j = ; j< l; j++) {
if (s[j].ch == temp) {
s[j].count++;
found = true;
}
}
if (!found) {
s[l].ch = temp;
s[l].count = ;
l++;
}
}
}
max = s[];
bool foundSecond = false;
i = ;
while (!foundSecond) {
if (s[i].count > max.count) {
second = max;
max = s[i];
foundSecond = true;
}
else if (s[i].count < max.count) {
second = s[i];
foundSecond = true;
}
i++;
}
for (i; i<l - ; i++) {
if (s[i].count > max.count) {
second = max;
max = s[i];
} else if (s[i].count < max.count && s[i].count > second.count) {
second = s[i];
}
}
printf("%c+%c:%d\n", second.ch, (char)(second.ch + ), second.count);
return ;
}
04-17 12:07
查看更多