54、字符流中第一个不重复的字符

题目描述

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

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值