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

Posted 源周率

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指offer》第五十题I:字符串中第一个只出现一次的字符相关的知识,希望对你有一定的参考价值。

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

#include <cstdio>
#include <string>

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

    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) != )
        hashTable[*(pHashKey++)] ++;  //将 ++pHasKey 结合到一句

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

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

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

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

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

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

    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] != )
            hashTable[str[hashKey++]] ++;
        
        hashKey = 0;
        while (str[hashKey] != )
        {
            if (hashTable[str[hashKey]] == 1)
                return hashKey;
            
            ++hashKey;
        }
        return -1;
    }
};
牛客网提交代码

 

以上是关于《剑指offer》第五十题I:字符串中第一个只出现一次的字符的主要内容,如果未能解决你的问题,请参考以下文章

《剑指offer》第五十六题I:数组中只出现一次的两个数字

剑指offer五十四之字符流中第一个不重复的字符

《剑指offer》第五十六题II:数组中唯一只出现一次的数字

《剑指offer》第五十九题I:滑动窗口的最大值

《剑指offer》第五十八题(翻转单词顺序)

《剑指offer》第五十八题(左旋转字符串)