题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
public class Solution { //Insert one char from stringstream public void Insert(char ch) { } //return the first appearence once char in current stringstream public char FirstAppearingOnce() { } }
这道题目的意思就是要我们实现边插入,边寻找我们想要的元素,所以给出的样例中需要我们实现两个函数。
解题思路:我们可以用一个Map 存储 元素出现的个数,然后用队列存储 元素出现的顺序,结合两者来进行实现,队首元素应该总是我们想要的目标值。
- FirstAppearingOnce处理逻辑:
队列是否为空:
是:则返回#表示找不到这样的元素;
否:返回队首元素 - Insert处理逻辑:
判断是否在Map中包含:
否:直接在队尾进行插入,并在map中插入;
是:更新map中元素的个数;判断该值和队首元素是否相等,如果相等,那么我们应该更新队列值,使得最新的队首元素即为我们想要求解的元素值。
import java.util.Map; import java.util.HashMap; import java.util.Queue; import java.util.LinkedList; public class Solution { //Insert one char from stringstream Map<Character, Integer> counts; Queue<Character> queue;