欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

剑指offer:字符流中第一个不重复的字符

程序员文章站 2022-06-17 16:19:00
...

题目描述

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。

输出描述:

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

思路:利用LinkedHashMap(记录了插入顺序),而HashMap是无序的随机插入,key用来存储字符,value用来存储字符出现的次数,对字符串遍历,然后遍历map集合,返回出现次数为1的字符,若用HashMap,则不能保证是第一个出现的字符,因为它存储和获取数据都是随机的非顺序的。

HashMap和LinkedHashMap的区别

剑指offer:字符流中第一个不重复的字符

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 '#';
    }
}