剑指offer:字符流中第一个不重复的字符
题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
思路:利用LinkedHashMap(记录了插入顺序),而HashMap是无序的随机插入,key用来存储字符,value用来存储字符出现的次数,对字符串遍历,然后遍历map集合,返回出现次数为1的字符,若用HashMap,则不能保证是第一个出现的字符,因为它存储和获取数据都是随机的非顺序的。
HashMap和LinkedHashMap的区别
Map的设计思想就是以空间来换时间,主要用来存储键值对。键不可以重复,值可以重复。
HashMap
HashMap根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null,允许多条记录的值为 Null,HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap,因为多线程操作Hash Map时,rehash时可能会导致数据的不一致,链表出现死循环的情况。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
LinkedHashMap
LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
------------------------------------------------------------------------------------------------------------------------------
Java代码实现
import java.util.Map;
import java.util.LinkedHashMap;
public class Solution {
Map<Character, Integer> map = new LinkedHashMap<>();
//Insert one char from stringstream
public void Insert(char ch)
{
if(map.containsKey(ch)){
map.put(ch, map.get(ch) + 1);
}
else{
map.put(ch, 1);
}
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
for(Map.Entry<Character, Integer> entry: map.entrySet()){
if(entry.getValue() == 1){
return entry.getKey();
}
}
return '#';
}
}
推荐阅读
-
剑指offer27:按字典序打印出该字符串中字符的所有排列
-
PHP获取字符流中第一个不重复字符的方法
-
剑指offer JZ54 字符流中第一个不重复的字符 Python 多解
-
剑指 offer代码最优解析——面试题35第一个只出现一次的字符
-
20200329-剑指offer-面试题48. 最长不含重复字符的子字符串(滑动窗口)
-
第一个只出现一次字符的位置 牛客网 剑指Offer
-
剑指offer——第一个只出现一次的字符位置
-
《剑指offer》-- 两个链表的第一个公共结点、链表中环的入口结点、删除链表中的重复结点
-
剑指offer两个面试案例 把字符串转换成整数 树中两个节点的最低公共祖先
-
剑指 Offer 48. 最长不含重复字符的子字符串