zoukankan      html  css  js  c++  java
  • 《剑指offer》第五十题(字符串中第一个只出现一次的字符)

    // 面试题50(一):字符串中第一个只出现一次的字符
    // 题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出
    // 'b'。
    
    #include <iostream>
    #include <string>
    //使用一个长度为常量的哈希表,两次遍历,时间复杂度O(n),空间复杂度O(1)
    char FirstNotRepeatingChar(const char* pString)
    {
        if (pString == nullptr)
            return '';
    
        const int tableSize = 256;
        unsigned int hashTable[tableSize];//建立一个简单的哈希表,键值为ASCII码的int值,值为其个数
        for (unsigned int i = 0; i < tableSize; ++i)
            hashTable[i] = 0;
    
        const char* pHashKey = pString;
        while (*(pHashKey) != '')//第一次遍历,统计pString字符串中每个字符的个数
            hashTable[*(pHashKey++)] ++;
    
        pHashKey = pString;
        while (*pHashKey != '')//第二次遍历,检查哈希表中第一个值为1的键值
        {
            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()
    {
        // 常规输入测试,存在只出现一次的字符
        Test("google", 'l');
    
        // 常规输入测试,不存在只出现一次的字符
        Test("aabccdbd", '');
    
        // 常规输入测试,所有字符都只出现一次
        Test("abcdefg", 'a');
    
        // 鲁棒性测试,输入nullptr
        Test(nullptr, '');
        system("pause");
        return 0;
    }

  • 相关阅读:
    Pollard rho模板
    GDKOI2018游记
    BZOJ2599: [IOI2011]Race
    Codeforces914E. Palindromes in a Tree
    可以删点的并查集
    本月题量 180122晚-180222午
    51nod1238 最小公倍数之和 V3
    51nod1237 最大公约数之和 V3
    hdu5608:function
    51nod1244 莫比乌斯函数之和
  • 原文地址:https://www.cnblogs.com/CJT-blog/p/10526941.html
Copyright © 2011-2022 走看看