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

Posted by DH on July 25, 2017

题目

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

输出描述

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

分析

最容易想到的就是用hashmap,key是对应的char,value是出现的次数,每次读入一个字符的时候,就去看这个字符是不是在hashmap中,如果不在就加入到hashmap, value设置为1,假如已经出现就在value的值上+1。

但是haspmap有一个问题就是存入的时候是无序的(这里说法不准确,应该说不是按照先后顺序存储,而是取余确定位置)。

因此,方案有两种,第一种是依旧使用hashmap,但是需要用一个list顺序存储输入的字符,然后从list读取char,去hashmap获得value,进行判断。 但是这会多使用内存。

方案二是使用LinkedHashMap,按照先后顺序存储,取的时候也是先进先出。

代码

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
public class Solution {
   LinkedHashMap<Character, Integer> linkedHM = new LinkedHashMap<>();
	//Insert one char from stringstream
    public void Insert(char ch)
    {
    		
        if (linkedHM.containsKey(ch)) {
			linkedHM.put(ch, linkedHM.get(ch)+1);
		}else{
			linkedHM.put(ch,1);
		}
    }
    
  //return the first appearence once char in current stringstream
    public char FirstAppearingOnce()
    {
    	char result = '#';
    	Iterator<Entry<Character, Integer>>iterator = linkedHM.entrySet().iterator();
    	while (iterator.hasNext()) {
    		Map.Entry entry = iterator.next();
			if ((int)entry.getValue() == 1) {
				result = (char) entry.getKey();
                break;
			}
				}
    	return result;
    }
}