题目
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
思路
由于字符(char)是长度为8的数据类型,共有256中可能,因此哈希表可以用一个长度为256的数组来代替,数组的下标相当于键值key,对应字符的ASCII码值;数组的值相当于哈希表的值value,用于存放对应字符出现的次数。
Java代码
如果不强制转换成Character,会默认调用remove(int index)这个函数!!!
//使用set实现查重,使用ArrayList实现存储数组中未重复的字符串
//Insert one char from stringstream
Set<Character> s = new HashSet<>();
ArrayList<Character> l = new ArrayList<>();
public void Insert(char ch) {
if(s.add(ch)) {
l.add(ch);
}else {
//注意:发现set中已经存在该字符时,不代表l中存在该字符,有可能被删去了
if(l.contains(ch)) {
l.remove((Character)ch);
//如果不强制转换成Character,会默认调用remove(int index)这个函数!!!
}
}
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce() {
if(l.size() == 0)
return '#';
return l.get(0);
}
收获
1.如果需要创建哈希表,键值为 字符,值为 数字时,可以考虑用数组(length=256)来替代,数组下标表示为字符的ASCII码值。
2.哈希表的时间复杂度为O(1),要求有较高的查找速度时,可以考虑使用哈希表(Java中可以使用HashMap)
3.如果需要判断多个字符是否在某个字符串中出现过,或者统计多个字符在某个字符串中出现的次数,可以考虑基于数组创建一个简单的哈希表,这样可以用很小的空间消耗换来时间效率的提升。