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