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

    // 面试题50(二):字符流中第一个只出现一次的字符
    // 题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从
    // 字符流中只读出前两个字符"go"时,第一个只出现一次的字符是'g'。当从该字
    // 符流中读出前六个字符"google"时,第一个只出现一次的字符是'l'。
    
    #include <iostream>
    #include <limits>
    
    using namespace std;
    
    class CharStatistics
    {
    public:
        CharStatistics() : index(0)//后初始化index=0
        {
            for (int i = 0; i < 256; ++i)
                occurrence[i] = -1;
        }
    
        void Insert(char ch)
        {
            if (occurrence[ch] == -1)//之前没有过,插入index
                occurrence[ch] = index;
            else if (occurrence[ch] >= 0)//之前出现过,设为-2
                occurrence[ch] = -2;
    
            index++;//用来指示出现过一次的字符的顺序
        }
    
        char FirstAppearingOnce()
        {
            char ch = '';
            int minIndex = numeric_limits<int>::max();//类型int的最大值
            for (int i = 0; i < 256; ++i)
            {
                if (occurrence[i] >= 0 && occurrence[i] < minIndex)//对只出现一次的字符进行搜索,找到最先出现的那个值
                {
                    ch = (char)i;
                    minIndex = occurrence[i];
                }
            }
    
            return ch;
        }
    
    private:
        // occurrence[i]: A character with ASCII value i;
        // occurrence[i] = -1: The character has not found;
        // occurrence[i] = -2: The character has been found for mutlple times
        // occurrence[i] >= 0: The character has been found only once
        int occurrence[256];
        int index;
    };
    
    // ====================测试代码====================
    void Test(const char* testName, CharStatistics chars, char expected)
    {
        if (testName != nullptr)
            printf("%s begins: ", testName);
    
        if (chars.FirstAppearingOnce() == expected)
            printf("Passed.
    ");
        else
            printf("FAILED.
    ");
    }
    
    int main()
    {
        CharStatistics chars;
    
        Test("Test1", chars, '');
    
        chars.Insert('g');
        Test("Test2", chars, 'g');
    
        chars.Insert('o');
        Test("Test3", chars, 'g');
    
        chars.Insert('o');
        Test("Test4", chars, 'g');
    
        chars.Insert('g');
        Test("Test5", chars, '');
    
        chars.Insert('l');
        Test("Test6", chars, 'l');
    
        chars.Insert('e');
        Test("Test7", chars, 'l');
        system("pause");
        return 0;
    }
  • 相关阅读:
    1104--DNA排序
    poj1050-To the Max
    编译:一个 C 程序的艺术之旅(转载)
    大话同步/异步、阻塞/非阻塞(转载)
    Windows 在 git bash下使用 conda 命令
    Python Multiprocessing 多进程,使用多核CPU计算 并使用tqdm显示进度条
    Python 写入训练日志文件并控制台输出
    nn.Conv2d 参数及输入输出详解
    Python中 list, numpy.array, torch.Tensor 格式相互转化
    Linux 上传代码到github
  • 原文地址:https://www.cnblogs.com/CJT-blog/p/10527180.html
Copyright © 2011-2022 走看看