编程题19---字符流中第一个不重复的字符

题目描述

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。

输出描述:

如果当前字符流没有存在出现一次的字符,返回#字符。
public class Solution {

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

}

 //return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{

}

}

思路(剑指offer里的):考察哈希表的灵活使用----

字符只能一个接着一个从字符流中读出来。可以定义一个数组容器来保存字符在字符流中的位置。当一个字符第一次从字符流中读出来时,把它在字符流中的位置保存到数组容器里。当这个字符再次从字符流中读出来时,那么它就不是只出现一次的字符,就可以忽略了。这时把它在数组容器中的值更改为一个特殊的值(比如负值)

简单来说就是:定义一个长度为256的数组(但是,java中char类型占用两个字节,定义为256可能只是因为表示英文字符256远远够了吧---),数组下标值对应字符的ASCII码,数组存放的是负值(下标对应的字符出现了多次),0(未出现过),正数(下标对应的字符只出现过一次,值为该字符在字符中的位置)。

首先定义两个全局变量,数组cc和字符对应的位置num(按输入计算)

public class Solution {
    //半小时通过
    private int []cc=new int[256];   //全局变量
    int num=1;//记录字符出现的下标  全局变量
   // for(int i=0;i<256;i++){
    //    cc[i]=0;  //多余了,因为成员变量有默认的初始值,int类型的默认初始化的值为0
   // }

    
    //Insert one char from stringstream
    public void Insert(char ch)
    {
        if(cc[ch]==0)
            cc[ch]=num;  //如果是第一次出现,记录其下标位置
        else
          cc[ch]=-1;     //若之前出现过,则将该字符对应的额索引位置上的值改为负值
        num++;
    }
  //return the first appearence once char in current stringstream
    public char FirstAppearingOnce()
    {
     //int min=100000;//记录最先出现的字符的下标
     int min=Integer.MAX_VALUE;  //初始化为整形的最大数----借鉴的
     int k=-1;      //记录字符对应的ASSCII码,需要返回--
   
    for(int i=0;i<256;i++){    //找到最小的大于0的值(只出现过一次-- >0; 最小---》第一个)
                               //数组里存的是字符的位置(只出现一次时)
        if(cc[i]>0 && cc[i]<min)
        {
            min=cc[i];
            k=i;
        }
    }
     if(k==-1)
         return '#';
     else
        return (char)k;
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值