第一个只出现一次的字符

面试题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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值