《剑指offer》面试题50:第一个只出现一次的字符(字符流)

题目:找出字符流中第一个只出现一次的字符。例如,当从字符流google中只读出前两个字符go时,第一个只出现一次的字符是g;当读完google时,第一个只出现一次的字符是l。


思路:

此题的关键在于“字符流”。因此最好能够记住在哪个位置出现了哪个字符,从而可以完成每读到一个字符,就能动态更新到目前为止第一个出现一次的字符。此题同样使用了长度为256的int数组作为哈希表,用字符的ascii码值作为表的键值,当字符仅出现了一次,就把字符的位置作为哈希表的值,如果没有出现则值为-1,如果出现的次数大于1则哈希表对应的值为-2。
当想要知道到某一位置时第一个出现一次的字符,可以通过扫描该哈希表,找到大于等于0的值中的最小值,该值所对应的字符就是当前状态第一个出现一次的字符。

基于以上思路,java参考代码如下:

public class FirstNotRepeatingCharInStream {
    public static class CharStatistics{
        private int[] times;
        private int index;
        public CharStatistics(){
            index = 0;
            times = new int[256];
            //-1表示未出现,>=0表示出现的位置且仅出现一次,-2表示出现两次及以上
            for(int i=0;i<256;i++)
                times[i] = -1;
        }
        
        public void insert(char ch){
            if(times[ch]==-1)
                times[ch] = index;
            else
                times[ch] = -2;
            index++;
        }
        
        public char find(){
            int minIndex = 256;
            char ret = '\77'; //若没有只出现一次的字符,显示\77,即?
            for(int i=0;i<256;i++){
                if(times[i]>=0 && times[i]<minIndex) {//minIndex为了找出第一个出现,必须要先出现才行
                    minIndex = times[i];
                    ret = (char)i;
                }
            }
            return ret;
        }
    }
    
    public static void main(String[] args){
        String str = "google";
        CharStatistics charStatistics = new CharStatistics();
        for(int i=0;i<str.length();i++){
            charStatistics.insert(str.charAt(i));
            System.out.print(charStatistics.find());
        }
    }
}
测试用例:

a.功能测试(读入一个字符;读入多个字符;读入的所有字符都是惟一的;读入的所有字符都是重复出现的)。
b.特殊输入测试(读入0个字符)。

参考:

https://www.jianshu.com/p/dd9826ff5109

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值