POJ C程序设计上阶 编程题#2:字符串中次数第2多之假名。期末练习。

编程题#2:字符串中次数第2基本上的字母

来源:
POJ (Coursera声明:在POJ上到位的练习将未会见计入Coursera的末尾成绩。)

留意: 总时间限定: 1000ms 内存限制: 65536kB

同等、字符串中次数第2多之假名

描述
输入一差长不超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
是因为最后要出口是孰字母,而且是第一单冒出的次基本上之假名而未是许母表里最为倚重前之第二大多的假名,所以记录各字母数量的数组没有开展排序,而是先将最多的字母之数清0,然后重新又找到第一独顶多之假名(即第二大抵的假名)输出。代码如下:

#include<stdio.h>
#include<iostream>
#include<string.h>

using namespace std;

int main()
{
    int count1[26] = { 0 };
    char a[1000];
    cin.getline(a, 1000);
    //cout << isChar((a + 2));
    //cout << strlen(a)<<endl;
    for (int i = 0; i < strlen(a);++i)
    {
        if (a[i] >= 65 && a[i] <= 90)       //upper character
            count1[a[i] - 65]++;
        else if (a[i] >= 97 && a[i] <= 122)     //lower character to upper character
        {
            count1[a[i] - 97]++;
            a[i] -= 32;
        }
    }
    int firstMax = 0, secondMax = 0;
    for (int i = 0; i < 26;++i)
    {
        if (count1[firstMax] <= count1[i])      //找最大
            firstMax = i;                   
    }
    for (int i = 0;i < 26;++i)
    {
        if (count1[i] == count1[firstMax])          //最大清零
            count1[i] = 0;
    }
    for (int i = 0;i < 26;++i)
    {
        if (count1[secondMax] <= count1[i])         //找第二大(最大已经清零所以第二大其实是最大)
            secondMax = i;                  
    }
    int num = count1[secondMax];            
    for (int i = 0;i < 26;++i)
    {
        if (count1[i] == count1[secondMax])         //第二大用500标记
            count1[i] = 500;
    }
    for (int i = 0;i < strlen(a);++i)
    {
        if (count1[a[i] - 65] == 500)               //找到第一个第二大的,输出
        {
            //printf("%c+%c:%d", a[i], a[i] + 32, num); 
            cout<<char(a[i])<<"+"<<char(a[i]+32)<<":"<<num;
            return 0;
        }
    }
    return 0;
}

描述

输入一失误长不跳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 }

 

相关文章