好像是前段時間筆試什麼公司的時候遇到的筆試題。記不太清楚了,似乎當晚回來就寫了個比較完整的版本,不過現在才想起來寫個小筆記。
唉,現在找工作難啊,沒相關的項目經驗和實習經驗,應屆畢業生,非名校,你就已經被判了死刑了有木有!不要說你基礎好啊!肯受苦啊!勤學奮進啊!愛加班哪!沒人鳥你啊!傷不起啊有木有~
好吧,吐個小槽,回來說說題目本身:
想法是這樣的,假設字符串只有英文。那就簡單了,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; }