每天学习一算法系列(17)(在一个字符串中找到第一个只出现一次的字符)

题目:

在一个字符串中找到第一个只出现一次的字符,如输入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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值