55-FirstCharacterInStream

题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。


public class FirstCharacterInStream {

        /*
        解题要点:
            1、ASCII 码转字符;http://blog.csdn.net/myweishanli/article/details/38924481
            字符转ascII 码;

            2、256的数组,初始化为-1,当第一次出现赋值为在字符流中的位置,第二次出现更新为-2;

            3、扫描整个字符串,找出数组中大于等于0的值对应的字符;

            4、用到的数据结构是hash表,其实就是数组

        解题bug:
                 #1 index 的初始化应该放在全局变量,初始化不能放在函数内,切记切记
                #2 找最小值这个初始值必须设置最大的
                #3  静态方法内部,不能直接调用非静态方法,可以通过new一个对象来实现调用非静态方法,
                 非静态方法必须寄居在对象上才能使用
         */

        int[] hash = new int[256];
        int index =0;  //#1

        //初始化hash表的值为-1
        FirstCharacterInStream() {
            for(int i=0;i<256;i++){
                hash[i] = -1;
            }
        }

        //Insert one char from stringstream
        public void Insert(char ch){

            if (hash[ch]<0){
                hash[ch] = index;
            }else if(hash[ch]>= 0){
                hash[ch] = -2;
            }
            index++;
        }
        //return the first appearence once char in current stringstream
        public  char FirstAppearingOnce() {

            int minIndex = 256;//#2 找最小值这个初始值必须设置最大的

            char minChar ='#';
            //找出最小的大于等于0的数值,即第一次出现的不重复的数值;
            for (int i=0 ;i<256;i++){
                if(hash[i]>=0&&minIndex>hash[i]){
                    minIndex = hash[i];
                    minChar = (char) i;
                }
            }
            if(minIndex >=0){
              return minChar;
            }else
                return '#';
        }


        //#3  静态方法内部,不能直接调用非静态方法,可以通过new一个对象来实现调用非静态方法,
        // 非静态方法必须寄居在对象上才能使用
        public static void main(String[] args){

            FirstCharacterInStream a = new FirstCharacterInStream();
            a.Insert('g');
            a.Insert('o');
            a.Insert('o');
            a.Insert('g');
            a.Insert('l');
            a.Insert('e');
            char output = a.FirstAppearingOnce();
            System.out.println(output);
        }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值