字符流中第一个不重复的字符

一.题目描述

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

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

二.程序代码

import java.util.Map;
import java.util.LinkedHashMap;
public class Solution {
    public 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()
    {
        char ret='#';
        for(Map.Entry<Character,Integer> e:map.entrySet()){
            int count=e.getValue();
            if(count==1){
                return e.getKey();
            }
        }
        return ret;
    }
}

三.运行结果

输入数据:google
输出数据:ggg#ll

四.分析

从这个结果可以看出,题目要求输入一个字符流,其中Insert(char ch);函数是用来扩充字符流的,也就是说:
(1)如果当前字符流为g

输出g

(2)那么调用Insert(char ch)这个函数再插入一个字符o,那么当前字符流就变为了go

输出gg

(3)如果再调用Insert(char ch)这个函数再插入一个字符o,那么当前字符流就变为了goo

输出ggg

(4)如果再次调用Insert(char ch)这个函数再插入一个字符g,那么当前字符流就变为了goog

输出ggg#

(5)如果再次调用Insert(char ch)这个函数再插入一个字符l,那么当前字符流就变为了googl

输出ggg#l

由此可见,当前字符流是在上一个字符流上进行不断地增加一个字符而确定的。
因此,我们需要使用Map<Key,Value>来存储当前字符流的每个字符及相应的出现次数,分别作为Map的Key和Value。
而且要特别注意:
要用LinkedHashMap<>();来实现你的Map,这样才能保证你的Map中的元素顺序是按当前插入元素来排序的。

五.Map的构造函数的区别

1. LinkedHashMap

LinkedHashMap是继承HashMap类,,具有 HashMap 集合上面所说的所有特点,除了 HashMap 无序的特点,LinkedHashMap 是有序的,因为 LinkedHashMap 在 HashMap 的基础上单独维护了一个具有所有数据的双向链表,该链表保证了元素迭代的顺序。
LinkedHashMap定义了accessOrder变量,值为true表示按照访问顺序排序,值为false表示按照插入顺序排序。accessOrder的默认值为false,也就是按照插入顺序排序,所以本题选用这个构造函数来实现Map

2.TreeMap

TreeMap中的元素默认按照key的自然顺序排序。(对Integer来说,其自然排序就是数字的升序;对String来说,其自然排序就是按照字母进行排序)

3.HashMap

HashMap可实现快速存储和检索,但其缺点是其包含的元素是无序的,这导致它在存在大量迭代的情况下表现不佳。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值