1、题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符 "go" 时,第一个只出现一次的字符是 "g" 。当从该字符流中读出前六个字符 “google" 时,第一个只出现一次的字符是"l"。
数据范围:字符串长度满足 ,字符串中出现的字符一定在 ASCII 码内。
进阶:空间复杂度 ,时间复杂度
后台会用以下方式调用 Insert 和 FirstAppearingOnce 函数。
2、算法分析:
容器使用的Map集合,key是字符,val是字符出现的次数。根据判断Map中的key的次数来求出出现一次的第一个字符。
注意,题目中说的是字符串是有序的。所以存储使用的是LinkedHashMap
知识补充:
- LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的。
- HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种。如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入)。
- LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序。
- LinkedHashMap是线程不安全的。
3、代码实现
import java.util.*;
public class Solution {
//Insert one char from stringstream
Map<Character,Integer> map = new LinkedHashMap<>();
public void Insert(char ch)
{
if(map.containsKey(ch)){
map.put(ch,2);
}else{
map.put(ch,1);
}
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
for(char c:map.keySet()){
if(map.get(c) == 1){
return c;
}
}
return '#';
}
}