算法题(每天刷一刷算法)
题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
解题思路如下:
1.用queue记录不重复的字符串
2.用map记录字符出现的次数
3.判断出现的字符次数是否为1,如果是,返回该字符,如果不是,弹出该字符,继续判断
4.如果队列为空,返回#
Java实现代码如下:
import java.util.*;
public class Solution {
//队列用来存放不重复字符,如google,存放为gole
Queue<Character> queue = new LinkedList<>();
//用来记录每个字符出现的次数
Map<Character, Integer> map = new HashMap<>();
//Insert one char from stringstream
public void Insert(char ch)
{
//如果字符出现的次数为0
if (!map.containsKey(ch)){
//向队列添加字符
queue.add(ch);
//设置字符出现的次数为1
map.put(ch, 1);
} else {
//如果字符出现的次数不为0,则通过map.get(ch)获取此字符出现的次数,并加1
//不会出现空指针异常,因为map.containsKey(ch)为true
map.put(ch, map.get(ch)+1);
}
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
//如果队列不为空
while (!queue.isEmpty()){
//获取队列第一个字符,不删除
char c = queue.peek();
//如果该字符出现的次数为1,返回该字符
if (map.get(c) == 1){
return c;
} else {
//否则,弹出第一个字符(即删除第一个字符)
queue.poll();
}
}
//如果循环完队列,还没有找到只出现1次的字符,则返回‘#’
return '#';
}
在牛客网实现链接:https://www.nowcoder.com/questionTerminal/00de97733b8e4f97a3fb5c680ee10720?toCommentId=6301907