剑指offer(54)字符流中第一个不重复的文字

如果是一个长度固定的字符串,可以定义哈希表的key是字符,value是字符出现的次数。每个字母根据其ASCⅡ(一共128种可能)值作为数组的下标对应数组的下标 对应数组的一个数字,数组中存储的是出现的次数。

public class Solution {
    //Insert one char from stringstream
    StringBuffer s = new StringBuffer();
    int[] arr = new int[128];
    public void Insert(char ch)
    {
        s.append(ch);
        arr[ch] += 1;
    }
  //return the first appearence once char in current stringstream
    public char FirstAppearingOnce()
    {
        char[] str = s.toString().toCharArray();
        for(char c : str){
            if(arr[c] == 1){
                return c;
            }
        }
        return '#';
    }
}

参考34题,还可以用下面着一种方法,可以将hashCode换成LinkedHashCode

链接:https://www.nowcoder.com/questionTerminal/00de97733b8e4f97a3fb5c680ee10720
来源:牛客网
 

Solution: Java版的,使用一个HashMap来统计字符出现的次数,同时用一个ArrayList来记录输入流,每次返回第一个出现一次的字符都是在这个ArrayList(输入流)中的字符作为key去map中查找。

import java.util.*;

public class Solution {

    HashMap<Character, Integer> map=new HashMap();

    ArrayList<Character> list=new ArrayList<Character>();

    //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);

        }

         

        list.add(ch);

    }

     

    //return the first appearence once char in current stringstream

    public char FirstAppearingOnce()

    {   char c='#';

        for(char key : list){

            if(map.get(key)==1){

                c=key;

                break;

            }

        }

         

        return c;

    }

}

猜你喜欢

转载自blog.csdn.net/qq_34403001/article/details/89354398