程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 找出字符串中出現頻率最少的字符,並將其去除,字符串頻率

找出字符串中出現頻率最少的字符,並將其去除,字符串頻率

編輯:C++入門知識

找出字符串中出現頻率最少的字符,並將其去除,字符串頻率


好像是前段時間筆試什麼公司的時候遇到的筆試題。記不太清楚了,似乎當晚回來就寫了個比較完整的版本,不過現在才想起來寫個小筆記。

唉,現在找工作難啊,沒相關的項目經驗和實習經驗,應屆畢業生,非名校,你就已經被判了死刑了有木有!不要說你基礎好啊!肯受苦啊!勤學奮進啊!愛加班哪!沒人鳥你啊!傷不起啊有木有~

好吧,吐個小槽,回來說說題目本身:

想法是這樣的,假設字符串只有英文。那就簡單了,ASCII表查起。查看可知,小寫字母對應的十進制范圍是97到122,大寫字母對應十進制65到90 。那我統計的時候判斷條件就是它們對應的十進制了,小寫字母統計數值放一個數組,大寫字母統計數放一個數組,然後統一到一個數組。

數組只需要創建大小為26 。因為這邊簡化了問題,假設是只有英文字母。

覺得寫的代碼還是比較直觀易懂的,就不多廢話了。

/*程序功能描述:找出字符串中出現頻率最小的字母,並將其去除;
Author:NerohHwang;
Date:10/9/2013 Wednesday;
*/
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
    char * Str = "dhajkhfkablcjnakjyhrweuipqhydhjasbvfjhlksdabklfjhslkMm";
    //下面兩個數組對照小寫和大寫,最後統一到一個數組中
    int iArrSmall[26];
    int iArrBig[26];
    int iSum[26];                            
    //統計
    for (int i = 0; i < 26; i ++)
    {
        iArrSmall[i] = iArrBig[i] =  0;           //全部初始化為0
        
    }
    for(int i = 0;  i < strlen(Str); i++)
    {
        if (Str[i] > 96 && Str[i] < 123)          //如果是比96大,即是屬於小寫字母范圍;當然,不能超過小寫z的范圍
        {
            iArrSmall[Str[i]-97]++;
        }
        else if (Str[i] <= 90 && Str[i] > 64)    //大寫字母范圍
        {
            iArrBig[Str[i]-65]++;
        }
        else
        {
            cout<<"Invalid letter!"<<endl;
            system("pause");
            exit(1);
        }
    }
    for (int i = 0; i < 26 ; ++i)
    {
        iSum[i] = iArrBig[i] + iArrSmall[i];
    }
    //下面對統計結果進行選擇,直接挑出最小的那一項即可,統計數需大於零,即該字母必須出現過
    int iSmallestIndex = iSum[0];
    for (int i = 1; i < 26; ++i)
    {
        if (iSmallestIndex > iSum[i] && iSum[i] > 0)
        {
            iSmallestIndex = i;
        }
    }

    cout<<"The smallest letter is "<<char(iSmallestIndex+97)<<" or "<<char(iSmallestIndex+65)<<endl;
    cout<<"There are "<<iSum[iSmallestIndex]<<" of them"<<endl;

    //更新數據
    char strNew[256];
    int  index = 0;
    for (int i = 0; i < strlen(Str) ; i++)
    {
      if (int(Str[i]) != (iSmallestIndex+97) && int(Str[i]) != (iSmallestIndex+65))
        {
             strNew[index] = Str[i];
             index++;
        }
    }
    strNew[index+1] = '\0';
    cout<<strlen(strNew)<<endl;
    cout<<strNew<<endl;

    //地址重新賦值,覆蓋原數據
    Str = strNew;
    cout<<Str<<endl;
    return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved