該博文主要介紹幾種利用雜湊思想的簡單的面試題
1 第一個只出現一次的字元在字串中找出第一個指出先一次的字元,如輸入"adsaaddsef",則輸出'e'思想:引入一個256個元素的字元數組,用來儲存輸入字串的字元的次數,然後遍曆該數組,直到數組元素為1時停止遍曆,並輸出該元素代碼:
char findFirstAppeared(char *str){if(str==NULL) return 0;char num[256] = "";char *p=str;while(*p){num[*p]++;p++;}p = str;while(*p){if(num[*p]==1)return *p;p++;}return 0;}2.從第一個字串中刪除在第二個字串中出現過的字元思想:利用額外數組存放第二個字串中字元。然後遍曆第一個字串,刪除數組中值為1的元素代碼
void deleteCharact(char *str, const char *mainStr){
if(str==NULL || mainStr==NULL) return ;
int a[256];memset(a, 0, sizeof(a));char *p = str;char *q=NULL;while(*mainStr)a[*mainStr++]++;while(*p){if(a[*p]){q=p;while(*q){*q=*(q+1);q++; //this must be paied more attention}}p++;}}
3 刪除字串中重複的字元
思想和上面差不多,都是利用雜湊映射的思想代碼如下:
void deleteRepeat(char *pStr){if(pStr==NULL)return ;char a[256];memset(a, 0, sizeof(a));char *q = NULL;char *p = pStr;while(*p){if((++a[*p])>1)//delete *pStr{q=p;while(*q){*q = *(q+1);q++;}}else//not find same characterp++;}}
4 判段兩個字串是否為變為詞變位詞:如果兩個單詞中出現的字母相同,並且每個字元出現的次數也相同。代碼如下
int isAnagrams(char *pFirst, char *pSecond){char aux[256];memset(aux, 0, sizeof(aux));char *p = pFirst;char *q = pSecond;while(*p){aux[*p]++;p++;}while(*q){if(aux[*q])aux[*q]--;q++;}int i=0;while(aux[i]==0&&i<256)i++;if(i==256)return 1;elsereturn 0;}