剑指Offer-50:字符串中第一个只出现一次的字符

题目 

  请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"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.如果需要判断多个字符是否在某个字符串中出现过,或者统计多个字符在某个字符串中出现的次数,可以考虑基于数组创建一个简单的哈希表,这样可以用很小的空间消耗换来时间效率的提升。

猜你喜欢

转载自blog.csdn.net/qq_32534441/article/details/89298426