题目:在一个字符串中找到第一个只出现一次的字符,如输入abaccdeff,则输出b
(Google 2006)
 
分析:如果只是从头到尾的比较每个字符以及它后面到末尾的字符,这样时间复杂度会达到
O(n2),这样的代码肯定不行,应该继续寻找优化的算法
 
因为字符串是由一个个字符组成的,而每一个字符在ASCII表中都对应自己的ASCII值,这样
就转化成了一个hash表,其中每个字符是key,每个字符在字符串中出现的次数为value
然后问题转化成了,在这个hash表中寻找出value是1的key,如果有多个满足条件的字符,则
输出第一个
因为hash表按照字符顺序来,所以直接遍历寻找,找到的第一个即为题目要求
 
写出实现这个功能的函数即可,前面加上必要的注释,体现出良好的代码习惯和风格
 
 
  1. /* 
  2. //Function:Find the first character which appears only one time in a string  
  3. //Input: the string  
  4. //Output:the character 
  5. */ 
  6.  
  7. char FindFirstChar(char * str) { 
  8.     if(str == NULL) 
  9.         return 0; 
  10.      
  11.     const int size = 256; 
  12.     int hashtable[size]; 
  13.  
  14.     for(int i=0; i<size; i++) 
  15.         hashtable[i] = 0; 
  16.      
  17.     char * ch = str; 
  18.     while(ch != '\0') { 
  19.         hashtable[*(ch++)]++; 
  20.     } 
  21.      
  22.     char * result = str; 
  23.     while(result != '\0') { 
  24.         if(hashtable[*result] == 1) 
  25.             return *result 
  26.         result++; 
  27.     } 
  28.  
  29.     return 0; 
 
总结:1.要熟悉基本的数据类型占的字节,位数,分不同的32位和64位机器
      2.在数据结构方面要联想到容器,哈希表,映射,计数等这些关键的点
      3.实现功能时要考虑到输入和输出的要求