题目描述:
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
思路:
两种思路:
- 哈希表,建立哈希表,输入字符,记录字符,把每个字符都遍历到,对每个字符出现的次数计数,遍历完后就能依据哈希表知道首先仅出现次数为1的字符。
- 哈希表,但这里有所不同,首先将所有字符的哈希表关键值初始化为-1,输入数据,如果该数据的哈希表关键值是-1,则将对应的哈希表关键值改为输入的索引顺序值(大于等于零),如果该数据的哈希表的关键值大于等于零,则表示该数据已经出现过,意味着不可能是他们了,则将对应的哈希表关键值改为-2......,这样一直下去,当输入结束后,最后从头遍历哈希表,得到哈希表关键值的最小值就是最前面第一次出现的字符的位置,所以就能求出对应的字符。
方式1:
class solution
{
private:
int str="";
int hash[256];
for(int i=0;i<256;i++)
{
hash[i]=0;
}
public:
void insert(char ch)
{
hash[ch]++;
str+=ch;
}
char FindFirst(string str)
{
for(int i=0;i<str.length();i++)
{
if(hash[str[i]]==1)
return str[i];
}
}
}
方式2:
class solution
{
public:
int hash[256];
int index=0;
for(int i=0;i<256;i++)
{
hash[i]=-1;
}
void insert(char ch)
{
/*将没有出现字符的哈希表值置为输入索引顺序值*/
if(hash[ch]==-1)//元素没出现过
hash[ch]=index;
else //元素已经出现过
hash[ch]=-2;
index+;
}
char FindFirst()
{
int maxmum=Inter.Max_Value;//输入的最后的字符的索引顺序值
int min=maxmum;
char result;
for(int i=0;i<256;i++)
{
if(hash[i]>=0&&hash[i]<=maxmum)
{
if(hash[i]<min)
{
min=hash[i];
result=(char)i;
}
}
}
return result;
}
}