字符流中第一个只出现一次的字符

一、题目

请实现一个函数用来找出字符流中第一个只出现一次的字符。

例如,当从字符流中只读出前两个字符 go 时,第一个只出现一次的字符是 g

当从该字符流中读出前六个字符 google 时,第一个只出现一次的字符是 l

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

数据范围

字符流读入字符数量 [0,1000]。

样例
输入:"google"

输出:"ggg#ll"

解释:每当字符流读入一个字符,就进行一次判断并输出当前的第一个只出现一次的字符。

二、思路解析

首先需要一个哈希表记录字符出现的次数,其次需要一个队列,存放当前出现一次的字符;

由于队列的结构特点是先入先出,所以字符流结束后第一个出现一次的字符一定在队;

所以当字符流不断输入的过程中,需要不断更新队列,不断更新哈希表。

例如:输入g 哈希表:<g,1> 队头:g;

           输入go 哈希表:<g,1><o,1> 队头:g;

           输入goo 哈希表:<g,1><o,2> 队头:g;

           输入goog 哈希表:<g,2><o,2> 队头元素不符合条件,弹出g,队列为空;

           输入googl 哈希表:<g,2><o,2><l,1> 队头:l;

           输入google 哈希表:<g,2><o,2><l,1><e,1>队头:l;

三、代码实现

class Solution{
public:
   
    //定义哈希表和队列
    unordered_map<char, int> count;
    queue<char> q;
    //Insert one char from stringstream
    void insert(char ch){
        //每输入一个字符 就更新哈希表和队列
        if( ++count[ch] > 1)
        //当新加一个字符 字符数量大于1的时候 判断当前队头是否大于1 如果大于1 队头不满足字符出现一次的条件 出队
            while(q.size() && count[q.front()] > 1) q.pop();
        else
        //当新加一个字符 不大于1 入队
            q.push(ch);
    }
    //return the first appearence once char in current stringstream
    char firstAppearingOnce(){
        if(q.size()) return q.front();
        return '#';
       
    }
};

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值