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

题目描述

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

解:

1.我们需要一个接收字符流的函数,然后还有一个处理的函数,那么我们需要变量用于数据传送。所以首先我们需要一个字符数组或者字符串,考虑到数组的定长,字符流的字数不确定,还是考虑字符串。

2.关于处理,显然最简单的就是根据“数组下标标记法”来做,即我们利用特定字符作为数组下标,数组的值作为出现次数,那么只需要O(n)就可以完成次数统计。但是本题的字符不确定,所以这个转换函数比较麻烦。但是Java中有比较方便的map,所以我们改用map来设计这个数据结构,key作为字符值,value作为出现次数。

3.统计最先出现的第一个不重复字符,两种方法,一个是将字符串转换为字符数组遍历,然后逐个访问map找出第一个value=1的字符,这种情况适合于字符串并不长,且第一个字符出现得早的情形,估计很多题目都是这种序列特点,所以我采用这一种。另一种是遍历map,这样比较稳定,只需要找出value=1的字符,利用String的index指标找出最小指标即可,但是缺点就在于整个map都得遍历完才能确定哪个字符出现得最早。

import java.util.*;

public class Solution {
    private String order="";
    private Map<Character,Integer> word=new HashMap<>();

    //Insert one char from stringstream
    public void Insert(char ch)
    {
        if(!word.keySet().contains(ch)){
            word.put(ch,1);
        }else{
           word.put(ch,word.get(ch)+1);
        }
        order += ch;
    }

    //return the first appearence once char in current stringstream
    public char FirstAppearingOnce()
    {
        char first='#';
        char[] array=order.toCharArray();
        for(char ch:array){
            if(word.get(ch) == 1){
                first=ch;
                break;
            }
        }
        return first;
    }
}

--end--

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页