哈希表以及哈希的应用

该博文主要介绍几种利用哈希思想的简单的面试题

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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值