第一个只出现一次的字符

来源:互联网 发布:什么直播软件最好 编辑:程序博客网 时间:2024/06/05 15:09

面试题35:第一个只出现一次的字符

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

解析:最好的办法是用一个哈希表来存储字符-出现次数,用字符作为key,出现次数最为value。这样查找的过程为O(1),所以这个思路的时间复杂度主要在构造这个哈希表。在c中char类型的数据为2^8=256个,因此数组的大小为256。需要遍历两次数组才可以完成这个功能,第一遍构造这个哈希表,第二遍是找出第一个出现1次的字符。


代码如下:

char FirstNotRepeatingChar(const char* pString)  {      if ( pString == NULL )          return '\0';        unsigned int hashTable[256];      memset(hashTable, 0, sizeof(unsigned int)*256);  //A      const char* pStart = pString;      while ( *pStart != '\0' )          hashTable[*(pStart++)]++;        pStart = pString;      while ( *pStart != '\0' )      {          if( hashTable[(*pStart)] == 1 )              break;          else              pStart++;      }            if ( *pStart != '\0' )          return *pStart;      else          return '\0';  }


最开始的时候也就是在A的位置,我是for循环来把所有的数组的初始值赋值为0的,但是后面发现了有一个csdn的作者用了memset()这个函数,于是查了一下,原来memset()可以为数组赋初值

注:关于memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体数组进行清零操作的一种最快方法

void *memset(void *s, int ch, size_t n);

函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 

0 0
原创粉丝点击