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

思路1:利用C++ STL的hash_map来统计每个字符出现的次数,维护一个Key为Query字串,Value为该Query出现次数的HashTable,即 Hashmap(Query,Value),每次读取一个Query,如果该字串不在Table中,那么加入该字串,并且将Value值设为1;如果该字 串在Table中,那么将该字串的计数加一即可。

思路2:由于字符(char)是一个长度为8的数据类型,因此总共有可能256 种可能。于是我们创建一个长度为256的数组,每个字母根据其ASCII码值作为数组的下标对应数组的对应项,而数组中存储的是每个字符对应的次数。这样我们就创建了一个大小为256,以字符ASCII码为键值的哈希表。我们第一遍扫描这个数组时,每碰到一个字符,在哈希表中找到对应的项并把出现的次数增加一次。这样在进行第二次扫描时,就能直接从哈希表中得到每个字符出现的次数了。

  1. // ab.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.  
  4. #include "stdafx.h"  
  5. #include<stdio.h>  
  6. #include <iostream>  
  7. #include <hash_map>  
  8. using namespace stdext;  
  9. using namespace std;   
  10. char FindFirstNotRepeat(char *str)  
  11. {  
  12.     hash_map<char,int> count;  
  13.     int i=0;  
  14.     while(str[i]!='\0')  
  15.     {  
  16.         hash_map<char,int>::iterator  exist=count.find(str[i]);  
  17.         if(exist==count.end())  
  18.             count.insert(make_pair(str[i],1));  
  19.         else 
  20.             (*exist).second++;  
  21.         i++;  
  22.     }  
  23.     hash_map<char,int>::iterator iter=count.begin();  
  24.     i=0;  
  25.     while(str[i]!='\0')  
  26.     {  
  27.         hash_map<char,int>::iterator  exist=count.find(str[i]);  
  28.         if((*exist).second==1)  
  29.             return (*exist).first;  
  30.         i++;  
  31.     }  
  32.     return 0;  
  33. }  
  34. char FindFirstNotRepeat2(char *str)  
  35. {  
  36.     const int tablesize=256;  
  37.     int count[tablesize];  
  38.     memset(count,0,sizeof(int)*tablesize);  
  39.     int i=0;  
  40.     while(str[i]!='\0')  
  41.     {  
  42.         count[str[i]]++;  
  43.         i++;  
  44.     }  
  45.     i=0;  
  46.     while(str[i]!=NULL)  
  47.     {  
  48.         if(count[str[i]]==1)  
  49.             return str[i];  
  50.         i++;  
  51.     }  
  52.     return 0;  
  53. }  
  54.  
  55. void main()  
  56. {  
  57.     char b[]="abaccdeff";  
  58.     char a=FindFirstNotRepeat2(b);  
  59.     cout<<a;  
  60. }  
  61.  
  62.  

注意:以上代码是在VS2005下执行的,VC6.0下hash_map不可用