面试题35:第一个只出现一次的字符
题目:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出'b'。
解析:最好的办法是用一个哈希表来存储字符-出现次数,用字符作为key,出现次数最为value。这样查找的过程为O(1),所以这个思路的时间复杂度主要在构造这个哈希表。在c中char类型的数据为2^8=256个,因此数组的大小为256。需要遍历两次数组才可以完成这个功能,第一遍构造这个哈希表,第二遍是找出第一个出现1次的字符。
代码如下:
char FirstNotRepeatingChar(const char* pString)
{
if ( pString == NULL )
return '\0';
unsigned int hashTable[256];
memset(hashTable, 0, sizeof(unsigned int)*256); //A
const char* pStart = pString;
while ( *pStart != '\0' )
hashTable[*(pStart++)]++;
pStart = pString;
while ( *pStart != '\0' )
{
if( hashTable[(*pStart)] == 1 )
break;
else
pStart++;
}
if ( *pStart != '\0' )
return *pStart;
else
return '\0';
}
注:关于memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
void *memset(void *s, int ch, size_t n);
函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s