题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
总结:哈希表,哈希表中存放的是该元素第一次在字符串流中出现的位置,一开始都位置都初始化为-1,并且pos初始化为0,如果遇到一个字母没有在字符串流中出现,就修改为对应的pos;如果出现过,即不为-1,就把他标记为-2,记为重复出现。
一开始犯的错,我以为用int hash_table[255] = {0}是直接对数组所有元素都赋0,谁知道是....只有第一个。
【更正】int hash_table[255] = {0}表示第一个元素赋值为0,其余的元素以缺省值0初始化,所以为{0,0,0,0,...}
int hash_table[255] = {-1},第一个元素赋值为-1,其余元素仍然以缺省值0初始化,所以为{-1,0,0,0,...},所以如果以非0初始化还是要用for循环。
为什么不能初始化c_num为0呢?因为如果你初始化0,可能有的第一个不重复元素下标就是0,所以为了和下标区分,就把初始化为-1.
class Solution
{
public:
Solution(){
c_num = new int[128];
for(int i = 0;i<128;i++){
c_num[i] = -1;
}
pos = 0;
}
~Solution(){
delete c_num;
}
//Insert one char from stringstream
void Insert(char ch)
{
if(c_num[ch] == -1){
c_num[ch] = pos;
}
else{
c_num[ch] = -2;
}
pos++;
}
//return the first appearence once char in current stringstream
char FirstAppearingOnce()
{
char ret = '#';
int fisrt_occour = INT_MAX;
for(int i = 0;i<128;i++){
if(c_num[i] >= 0 && c_num[i] < fisrt_occour){
fisrt_occour = c_num[i];
ret = i;
}
}
return ret;
}
int pos;
int *c_num;
};