100-17

第17题(字符串):
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。  

分析:这道题是2006年google的一道笔试题。

思路:这道题,我看到的时候,竟然没想到最正常的思路,就是从头到尾遍历,每遍历一个字符,就再遍历一遍字符串,看是不是当前字符在字符串中只出现了一次。。。这个思路是最正常,最直观的思路,但是它的时间复杂度为n方,比较慢。。。我这次最先想到的是,要想找到只出现一次的字符,当然我只要遍历一次,得出每个字符出现的次数,然后再遍历出第一个出现次数为一的字符就可以,其实这个思路也挺直观的。。。统计字符出现的次数,使用的方法其实可以说算是hash,需要26个空间,空间复杂度为O(1),时间复杂度为O(n)。

/*================================================================*\
第17题(字符串):
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。  
分析:这道题是2006年google的一道笔试题。
\*================================================================*/
#include <iostream>

using namespace std;

char findFirst(char *index,int length){
	int hashTable[26] = {0};
	for(int i=0 ; i < length ; ++i){//统计每个字符出现的次数
		++hashTable[index[i]-'a'];
	}
	for(int i=0 ; i < length ; ++i){//找出第一个出现次数为1的字符
		if(1 == hashTable[index[i]-'a']){
			return index[i];
		}
	}
	return NULL;
}

int main(){
	char index[] = "abaccdeff";
	
	char ret = findFirst(index,9);
	if(NULL != ret){
		cout << ret << endl;
	}else{
		cout << "error:没有只出现过一次的字符" << endl;
	}
	return 1;
}

转载于:https://my.oschina.net/dapengking/blog/85794

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值