编程练习
题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。
思路:首先想到了之前做过的一道字符数组中第一个出现的字符,但是仔细一看发现不一样的地方是这个地方的输入是一个字符流,给定的函数体中的Insert函数就是模拟字符流,一次插入一个字符,我们需要依次保存这些字符,形成字符流,想到了java中的ArrayList来盛装这些字符。为了统计每个字符出现的次数,我们还需要对每个插入的字符增加一个额外的信息,即出现次数,想到了Key-value形式的HashMap来解决,利用java中的HashMap,将输入的每个字符和它出现的次数存入hashmap中,最后再ArrayList中遍历字符,取出Hashmap中第一个出现次数为1的字符即可。
java代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32import java.util.ArrayList;
import java.util.HashMap;
public class FirstAppearingOnce {
HashMap<Character, Integer> cmap=new HashMap<Character,Integer>();
ArrayList<Character> list=new ArrayList<Character>();
/**
* 每次插入一个字符来模拟字符流
* @param ch
*/
public void Insert(char ch)
{
if(cmap.containsKey(ch)) {
cmap.put(ch, cmap.get(ch)+1);
}else {
cmap.put(ch, 1);
}
list.add(ch);
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
char a='#';
for(int i=0;i<list.size();i++) {
if(cmap.get(list.get(i))==1) {
a=list.get(i);
break;
}
}
return a;
}
}