期末習題

一、字符串中次數第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;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容