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

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

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

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

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

数据范围:

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

样例:

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

代码:

class Solution {   
    //使用哈希表统计每个字符的出现次数
    Map<Character,Integer>mp = new HashMap<>();
    //使用队列维护字符的插入顺序,用于快速查找第一个唯一字符
    Queue<Character>q = new LinkedList<>();
    //Insert one char from stringstream   
    public void insert(char ch){
        //更新字符出现次数,如果字符已存在则计数+1,否则初始化为1
        mp.put(ch,mp.getOrDefault(ch,0)+1);
        //将字符加入队列尾部,保持插入顺序
        q.offer(ch);
    }
    //return the first appearence once char in current stringstream
    public char firstAppearingOnce(){
        //移除队列头部所有出现次数>1的字符
        while(!q.isEmpty()&&mp.get(q.peek())>1)q.poll();
        //检查队列是否为空,如果为空,说明没有不重复的字符,返回'#'
        if(q.isEmpty())return '#';
        //否则返回当前队列头部的第一个唯一字符
        else return q.peek();
    }
}

posted @ 2025-05-30 08:44  回忆、少年  阅读(9)  评论(0)    收藏  举报