• 字符流中第一个不重复的字符


    题目描述

    请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。

    输出描述:

    如果当前字符流没有存在出现一次的字符,返回#字符。



    思路:时间复杂度O(1),空间复杂度O(n)
            1、用一个128大小的数组统计每个字符出现的次数
            2、用一个队列,如果第一次遇到ch字符,则插入队列;其他情况不在插入
            3、求解第一个出现的字符,判断队首元素是否只出现一次,如果是直接返回,否则删除继续第3步骤

    分析:可以看出相同的字符只被插入一次,最多push128个,同时大多数情况会直接返回队首。所以大家不要被里面的while循环迷惑
    class Solution
    {
    public:
      //Insert one char from stringstream
        void Insert(char ch)
        {
           ++cnt[ch-''];
           if(cnt[ch-'']==1)
    		data.push(ch);
        }
      //return the first appearence once char in current stringstream
        char FirstAppearingOnce()
        {
        	while(!data.empty() && cnt[data.front()] >=2 )	data.pop();
            if(data.empty())	return '#';
            return data.front();
        }
    	
        Solution() {
            memset(cnt,0,sizeof(cnt));
        }
    private:
        queue<char> data;
        unsigned cnt[128];
        
    };
    

      

    自己想到了哈希表,却不知道如何具体落实!

    class Solution
    {
    public:
      //Insert one char from stringstream
        string s;
        char hash[256]={0};
        void Insert(char ch)
        {
            s+=ch;
            hash[ch]++;
        }
      //return the first appearence once char in current stringstream
        char FirstAppearingOnce()
        {
            int size=s.size();
            for(int i=0;i<size;i++) {
                if(hash[s[i]]==1)
                    return s[i];
            }
            return '#';
        }
    };
    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    ArcEngine的符号库
    Web programming is functional programming (Web编程是函数式编程)
    arcengine中拓扑的使用(ZZ)
    Win32基于事件驱动的消息机制(ZZ)
    人生要小心处理的50件事
    谁想出来的?
    80后 最牛的辞职信
    能读懂这些话的,都是心里有故事的人
    Try to code some sql statement to catch the consume much CPU time sps.
    读书是为了生命的完整
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7447065.html
Copyright © 2020-2023  润新知