码迷,mamicode.com
首页 > 其他好文 > 详细

《剑指offer》第五十题I:字符串中第一个只出现一次的字符

时间:2020-04-05 18:12:50      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:signed   sign   offer   返回   click   key值   哈希表   void   cst   

// 面试题50(一):字符串中第一个只出现一次的字符
// 题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出
// ‘b‘。

#include <cstdio>
#include <string>

char FirstNotRepeatingChar(const char* pString)
{
    if (pString == nullptr)
        return \0;

    const int tableSize = 256;  //char为8位, 2 ^ 8 = 256种可能
    unsigned int hashTable[tableSize]; //构建哈希表
    for (unsigned int i = 0; i < tableSize; ++i)
        hashTable[i] = 0;

    const char* pHashKey = pString; //字符串索引/哈希表key值
    //第一次遍历统计字符出现次数
    while (*(pHashKey) != \0)
        hashTable[*(pHashKey++)] ++;  //将 ++pHasKey 结合到一句

    pHashKey = pString;
    //第二次遍历寻找出现次数为1的第一个字符
    while (*pHashKey != \0)
    {
        if (hashTable[*pHashKey] == 1)
            return *pHashKey;

        ++pHashKey;
    }
    return \0;
}
技术图片
// ====================测试代码====================
void Test(const char* pString, char expected)
{
    if (FirstNotRepeatingChar(pString) == expected)
        printf("Test passed.\n");
    else
        printf("Test failed.\n");
}

int main(int argc, char* argv[])
{
    // 常规输入测试,存在只出现一次的字符
    Test("google", l);

    // 常规输入测试,不存在只出现一次的字符
    Test("aabccdbd", \0);

    // 常规输入测试,所有字符都只出现一次
    Test("abcdefg", a);

    // 鲁棒性测试,输入nullptr
    Test(nullptr, \0);

    return 0;
}
测试代码

分析:确实是简易哈希表。

注意牛客网是返回位置,上述代码是返回字符。

技术图片
class Solution {
public:
    int FirstNotRepeatingChar(string str) {
        
        if (str.length() <= 0)
            return -1;
        
        const int tableSize = 256;
        unsigned int hashTable[tableSize];
        for (unsigned int i = 0; i < tableSize; ++i)
            hashTable[i] = 0;
        
        int hashKey = 0;
        while (str[hashKey] != \0)
            hashTable[str[hashKey++]] ++;
        
        hashKey = 0;
        while (str[hashKey] != \0)
        {
            if (hashTable[str[hashKey]] == 1)
                return hashKey;
            
            ++hashKey;
        }
        return -1;
    }
};
牛客网提交代码

 

《剑指offer》第五十题I:字符串中第一个只出现一次的字符

标签:signed   sign   offer   返回   click   key值   哈希表   void   cst   

原文地址:https://www.cnblogs.com/ZSY-blog/p/12638169.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!