题目:
在一个字符串中找到第一个只出现一次的字符,如输入abaccdeff,则输出b.
(这道题是2006 年google 的一道笔试题)
思路一:
由于题目与字符出现的次数相关,我们可以统计每个字符在该字符串中出现的次数,要达到这样的目的的话那么我们可以利用Hash表来解这样的问题,用一个可以容纳所有的char的数组来作为容器,把相应的字符所对应的ASCLL码值作为下表进行映射,这样我们遍历两遍就可以找出第一个只出现一次的字符。现在的问题是数组该定义多大呢?由于字符(char)是一个长度为8的数据类型,因此总共有可能256 种可能,于是我们创建一个长度为256的数组,每个字母根据其ASCII 码值作为数组的下标对应数组的对应项,而数组中存储的是每个字符对应的次数。
代码如下:
#include "stdafx.h"
#include <assert.h>
#define ALL_CHAR_COUNT 256
/*----------------------------
找出只第一次出现一次的字符.
Copyright by yuucyf 2011.07.21
-----------------------------*/
TCHAR FindFristAppearChar(TCHAR* lptszStr)
{
assert(NULL != lptszStr);
TCHAR atszHashMap[ALL_CHAR_COUNT + 1] = {0};
int i32Len = _tcslen(lptszStr);
for (int i32I = 0; i32I < i32Len; i32I++)
atszHashMap[*(lptszStr+i32I)]++;
for (int i32J = 0; i32J < i32Len; i32J++)
{
if (atszHashMap[*(lptszStr + i32J)] == 1)
return *(lptszStr+i32J);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
TCHAR* lptszStr = _T("abaccdeff");
_tprintf(_T("First appear char is %c.\n"), FindFristAppearChar(lptszStr));
return 0;
}