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

剑指offer

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

集合+字符+api

注意:顺序,key:value

import java.util.*;
    public class Solution {

    /*题目:
    请实现一个函数用来找出字符流中第一个只出现一次的字符。
    例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。
    当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
    */
        /*
        分析:字符:char
              个数:int
              顺序:第一次出现一次
                | 字符      | key  | value |
                | -------- | ---- | ----- |
                | 'go'     | g    | **1** |
                |          | o    | 1     |
                | 'google' | g    | 2     |
                |          | o    | 2     |
                |          | l    | **1** |
                |          | e    | 1     |
                思路:
                需要map来装入key和value,但是要考虑顺序问题用arraylist
                map: 判断当前键是否在map中
                    如果在 就更改当前键的值,通过键来获取值,然后在 获得的值的基础上 +1
                    如果没在 就添加进入map中,此时键为当前字符,值为1;
                 注意:要  import java.util.*;
         */
        //定义一个hashmap,用来存放键和值
        HashMap<Character,Integer> mp = new HashMap<Character,Integer>();
        //定义一个arraylist,用来保存顺序,直接存放键,然后遍历arraylist中的内容,这个内容就是存放的map中的键
        ArrayList<Character> list = new ArrayList<Character>();
        //Insert one char from stringstream
        public void Insert(char ch)
        {//判断是否由这个键ch
            if(mp.containsKey(ch)){
                //如果在 就更改当前键的值,通过键来获取值,然后在 获得的值的基础上 +1
                mp.put(ch,mp.get(ch)+1);
            }else{
                //如果没在 就添加进入map中,此时键为当前字符,值为1;
                mp.put(ch,1);
            }
            //直接存放键,用来保存顺序
            list.add(ch);
        }
        //return the first appearence once char in current stringstream
        public char FirstAppearingOnce()
        {//历arraylist中的内容,这个内容就是存放的map中的键
            for(char list_val: list){
                //通过键来获得内容,此时遍历保证了顺序,从头到尾
                
                if(mp.get(list_val) == 1){
                    //如果内容为1,就是第一次出现且出现了一次,然后返回这个键
                    return list_val;
                }
            }
            //遍历完了list都没有找到符合条件的:第一次出现一次的,就返回‘#’
            return '#';
        }
    }
字符 key value
'go' g 1
o 1
'google' g 2
o 2
l 1
e 1
posted @ 2020-08-03 18:35  ASini  阅读(137)  评论(0编辑  收藏  举报