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;
    }
  • 相关阅读:
    Codeforces Round #321 (Div. 2) D. Kefa and Dishes 状压dp
    Codeforces Round #406 (Div. 2) D. Legacy 线段树建模+最短路
    HDU 4897 Little Devil I 树链剖分+线段树
    HDU 5405 Sometimes Naive 树链剖分+bit*****
    HDU 5274 Dylans loves tree 树链剖分+线段树
    BZOJ 2243: [SDOI2011]染色 树链剖分+线段树区间合并
    HDU 5544 Ba Gua Zhen dfs+高斯消元
    HDU 3949 XOR 线性基
    BZOJ 2460: [BeiJing2011]元素 线性基
    Educational Codeforces Round 18 C. Divide by Three DP
  • 原文地址:https://www.cnblogs.com/CJT-blog/p/10527180.html
Copyright © 2011-2022 走看看