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 '#';
    }

};
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-03 17:37
点赞 评论 收藏
分享
06-18 13:28
已编辑
门头沟学院 Web前端
爱睡觉的冰箱哥:《给予你300的工资》,阴的没边了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务