JZ54 字符流中第一个不重复的字符*

题目描述

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

思路

这道题需要考虑两个点:
(1) 关于重复字符的问题
(2) 关于读取当前字符流中第一个出现不重复的字符的问题

自己总结了一下关于重复的解题思路:
一般可以有两种方法:

  • 利用set这个容器的特点,有一个内置函数count(如果找到就可以,可以用set)
  • 利用map,key就是字符,value放字符的个数(如果需要保存起来就用这个)

上面第二个问题,一开始我想到的就是创建一个变量保存第一个不重复的字符,但是有个问题,万一接下来又遇到了这个字符,怎么去找当前第一个不重复的呢?

我想到了一个方法,可以利用队列来保存这些字符

具体的思路:
insert时:

  • 将字符流的字符及各自出现的次数放入map中
  • 同时,将字符全部存进队列
    取第一个非重复的数:
    从地队列中进行取数,取的时候从map中看下它的个数,如果是一个,那就取它;如果不是一个,那就从队列中丢掉;如果队列空了,那就说明没有不重复的字符,返回#

注:这里我一开始不知道怎么在两个函数之间共用容器map和queue,看了下讨论区发现,可以通过在函数外部定义公共public变量

代码

class Solution
{
public:
        map<char,int> data;
        queue<char> help;
  //Insert one char from stringstream
    void Insert(char ch)
    {
        if(data.count(ch)==0)
            data.insert(make_pair(ch,1));
        else
            data[ch]++;
        help.push(ch);
    }
  //return the first appearence once char in current stringstream
    char FirstAppearingOnce()
    {
        while(!help.empty())
        {
            if(data[help.front()]==1)
                return help.front();
            else
                help.pop();
        }
       if(help.empty())
            return '#';
    }

};
全部评论

相关推荐

我也曾抱有希望:说的好直白
点赞 评论 收藏
分享
offer多多的六边形战士很无语:看了你的博客,感觉挺不错的,可以把你的访问量和粉丝数在简历里提一下,闪光点(仅个人意见)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务