【栈队列堆】【打卡84天】《剑指Offer》2刷:JZ75 字符流中第一个不重复的字符

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

猜你喜欢

转载自blog.csdn.net/Sunshineoe/article/details/121374327