题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"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;
}
}