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


    题目描述

    请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"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 '#';
        }
    };
    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    当向数据库插入数据的同时返回插入数据的编号(自动生成的编号)
    75条方法改变你的程序人生
    2012下半年计划
    .NET开发中的事务处理大比拼
    JavaScript使用技巧精萃
    生成WebService的代理类操作步骤
    标书陈述总结
    自定义SharePoint 2010 功能区
    做培训、演讲、与回报的区别
    K2 SmartObject 本质
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7447065.html
Copyright © 2020-2023  润新知