JSMS34-第一次只出现一次的字符-剑指offer35

156 阅读1分钟

题目描述:这道题是要求输入一个字符串,得到这个字符串中只出现一次的字符。

解析:当然这道题很明显了,直接遍历加进哈希表中就可以解决了,但是我这边用的是二维数组,array[2][56];array[0][x]存的是出现的次数,array[1][x]存的是出现的位置(也就是在字符串中什么位置出现),这样遍历一遍字符串就可以获取字符串中字符出现的次数和位置了,然后得到出现的次数为1的字符,并且比较出现的位置,选取最小的那个,弹出就可以了。时间复杂度O(N),只需要遍历一次字符串和存放字符的数组。

#include <stdio.h>
#include <stdio.h>

char getFirst(char *c,int len)
{
	int times[2][52]={0,};
	int tmp;
	int retTmp,min=999;
	char ret;
	for(int i=0;i<len;i++)
	{
		if(c[i]>='a'&&c[i]<='z')
		{
			tmp=c[i]-'a';
			times[0][tmp]++;	
			if((times[1][tmp])==0)
			{
				times[1][tmp]=i;
			}
		}else if(c[i]>='A'&&c[i]<='Z')
		{
			tmp=c[i]-'A';
			times[0][tmp+26]++; 
			if((times[1][tmp+26])==0)
			{
				times[1][tmp+26]=i;
			}
		}
	}
	tmp=-1;
	for(int i=0;i<52;i++)
	{
		//printf("%d--%d\n",times[0][i],times[1][i]);
		
		if(times[0][i]==1&&times[1][i]<min)
		{
			retTmp=i;
			min=times[1][i];
			tmp=0;
		}
		
	}
	
	if(tmp==0)
	{
		if(retTmp<26)
		{
			ret=97+retTmp;
		}else 
		{
			ret=65+(retTmp-26);
		}
	}else
	{
		ret=NULL;
	}
	return ret;
}




int main()
{
	char str[]="aMmPbvskAjFdGAjGHaAQKvYnOCsGdHaJhEfQgGsa";
	int len=sizeof(str)/sizeof(str[0]);
	char ret=getFirst(str,len);	
	printf("%c\n",ret);		//return M
	char str1[]="jkashjAjklVNMoi";
	len=sizeof(str1)/sizeof(str1[0]);
	ret=getFirst(str1,len);
	printf("%c\n",ret);		//return a
}