该博文主要介绍几种利用哈希思想的简单的面试题
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 character
p++;
}
}
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; else return 0; }