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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值