题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
解:
1.我们需要一个接收字符流的函数,然后还有一个处理的函数,那么我们需要变量用于数据传送。所以首先我们需要一个字符数组或者字符串,考虑到数组的定长,字符流的字数不确定,还是考虑字符串。
2.关于处理,显然最简单的就是根据“数组下标标记法”来做,即我们利用特定字符作为数组下标,数组的值作为出现次数,那么只需要O(n)就可以完成次数统计。但是本题的字符不确定,所以这个转换函数比较麻烦。但是Java中有比较方便的map,所以我们改用map来设计这个数据结构,key作为字符值,value作为出现次数。
3.统计最先出现的第一个不重复字符,两种方法,一个是将字符串转换为字符数组遍历,然后逐个访问map找出第一个value=1的字符,这种情况适合于字符串并不长,且第一个字符出现得早的情形,估计很多题目都是这种序列特点,所以我采用这一种。另一种是遍历map,这样比较稳定,只需要找出value=1的字符,利用String的index指标找出最小指标即可,但是缺点就在于整个map都得遍历完才能确定哪个字符出现得最早。
import java.util.*;
public class Solution {
private String order="";
private Map<Character,Integer> word=new HashMap<>();
//Insert one char from stringstream
public void Insert(char ch)
{
if(!word.keySet().contains(ch)){
word.put(ch,1);
}else{
word.put(ch,word.get(ch)+1);
}
order += ch;
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
char first='#';
char[] array=order.toCharArray();
for(char ch:array){
if(word.get(ch) == 1){
first=ch;
break;
}
}
return first;
}
}
--end--