《剑指offer》——字符流中第一个不重复的字符

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

思路:
首先应当明确,字符流是指像流水一样的字符,一去不复返,意味着只能访问一次
使用数组来标记各个字符对应的状态

  • -1:表示出现0次
  • -2:表示出现1次以上
  • 0~n:表示出现1次时位置

然后再遍历一遍数组找到位置最小的即可。

class Solution
{
    int s[256];//辅助数组
    char c;
    unsigned int index;//标识字符在字符流中的位置
public:
    Solution()
    {
        memset(s, -1, 256*sizeof(int));//初始化数组中所有的元素都为-1,即每个字符只出现了一次
        c = '#';//若没有不重复的字符,则返回#号
        index = 0;//从下标为0的位置开始
    }

    void Insert(char ch)
    {
        if(s[ch] == -1)//如果字符值出现一次,则记下字符在字符流中的位置
            s[ch] = index;
        else if(s[ch] >= 0)//如果字符出现了一次以上,则将数组中的元素更新为-2
            s[ch] = -2;
        index++;//位置标识后移一位
        c = '#';//若输入字符流为空,则返回#号
    }

    char FirstAppearingOnce()
    {
        unsigned int minIndex = index;//字符流的长度
        for(int i = 0; i < 256; i++)//遍历辅助数组
        {
            if(s[i] >= 0 && s[i] <= minIndex)//如果字符对应数组中的值大于等于0或小于等于字符在字符流中的最小位置,则更新第一个不重复的字符和对应的位置
            {
                c = i;
                minIndex = s[i];
            }
        }
        return c;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值