方法一:LinkedHashMap <Character, Integer>
import java.util.LinkedHashMap;
//必须要用LinkedHashMap,不能用HashMap/Map //因为LinkedHashMap的有序性(要求返回第一个char)
public class Solution {
LinkedHashMap <Character, Integer> map = new LinkedHashMap <Character, Integer>();
//空间O(N), N为字符类型数量,小于100
// (1) Insert one char from stringstream
public void Insert(char ch){//这里的意思应该是多次调用Insert函数,每次插入一个char
if(map.containsKey(ch)){
map.put(ch,map.get(ch)+1);
}
else map.put(ch,1);
}//时间O(N), N为字符类型数量,小于100 空间O(1)
// (2) return the first appearence once char in current stringstream
public char FirstAppearingOnce(){//这个函数和上面的函数任意独立穿插调用使用
for(char ch:map.keySet()){//.keySet()获取map里面所有的key
if(map.get(ch) == 1)return ch;
}
return '#';
}//时间O(N), N为字符类型数量,小于100 空间O(1)
} 方法二(高效):int[128]存次数 + Queue< Character>
import java.util.LinkedList;
public class Solution {
int[] count = new int[128];//ASCII
LinkedList<Character> queue = new LinkedList<Character>();//注意add/remove的使用
//空间O(N)
public void Insert(char ch){
if(++count[ch]==1)queue.add(ch);
}//时间O(1) 空间O(1)
public char FirstAppearingOnce(){
while(queue.peek() != null){
if(count[queue.peek()]>1)queue.remove();//重复了就移出队列,它不会再回来了
else return queue.peek();
}
return '#';
}//时间O(N) 如果FirstAppearingOnce()量大的话,可以接近O(1) //空间O(1)
} 
京公网安备 11010502036488号