题目
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”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;
}
}