IT入门 > 面试题 > python题库 > 剑指offer >

IT入门 > 面试题 > python题库 > 剑指offer >

055-字符流中第一个不重复的字符

  你会看到这个提示,那是因为你的系统无法识别某栏目的模型信息,或者你新建模型后,没为这个模型设计单独的模板。不同模型的文档浏览页的模板为:article_模型名字标识.htm 如“article_article.htm”,更多的信息你可以在频道模型管理的地方查看。
附加标题 内容:
模板调用标记:
题型:1单选,2多选,3填空,4问答,5排序 内容:
模板调用标记:
4
选项A 内容:
模板调用标记:
选项B 内容:
模板调用标记:
选项C 内容:
模板调用标记:
选项D 内容:
模板调用标记:
答案 内容:
模板调用标记:
 

 

 

#题目描述


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

如果当前字符流没有存在出现一次的字符,返回#字符。

#分析


类似的题目

 

剑指Offer--035-第一个只出现一次的字符位置

但是第35题只要求我们找到一个字符串中第一个只出现一次字符即可, 但是这道题相当于一个在线算法, 要求我们能对一个源源不断的输入流进行处理

字符只能一个接着一个从字符流中读取出来, 因此我们可以定义一个数据容器来保存字符在字符流中的位置, 当一个字符第一次从字符流中拂去出来的时候, 把它保存在字符流中的位置保存到容器中。

当这个字符再次从字符流中被读取出来的时候, 那么它就不是只出现一次的字符, 也就是被忽略了。这时候就把在数据容器里保存的值更新成一个特殊的值即可。

为了更加高效的解决这个问题, 需要在O(1)的时间内往数据容器里插入一个字符, 以及更新一个字符对应的值。

#代码


#include <iostream>

#include <cstring>





using namespace std;





//  调试开关

#define __tmain main



#ifdef __tmain



#define debug cout



#else



#define debug 0 && cout



#endif // __tmain





class Solution

{

public:

    Solution()

    {

        str = "";

        memset(count, '\0', sizeof(count));

    }



    //  Insert one char from stringstream

    void Insert(char ch)

    {

        str += ch;

        count[(int)ch]++;

    }



    //  Return the first appearence once char in current stringstream

    char FirstAppearingOnce()

    {

        int len = str.size( );



        for(int i = 0; i < len; i++)

        {

            if(count[(int)str[i]] == 1)

            {

                return str[i];

            }

        }



        return '#';

    }



private:

    std::string     str;

    int             count[256];





};



int __tmain( )

{

    Solution solu;



    solu.Insert('g');

    cout <<solu.FirstAppearingOnce( ) <<endl;



    solu.Insert('o');

    cout <<solu.FirstAppearingOnce( ) <<endl;



    solu.Insert('o');

    cout <<solu.FirstAppearingOnce( ) <<endl;



    solu.Insert('g');

    cout <<solu.FirstAppearingOnce( ) <<endl;



    solu.Insert('l');

    cout <<solu.FirstAppearingOnce( ) <<endl;



    solu.Insert('e');

    cout <<solu.FirstAppearingOnce( ) <<endl;





    return 0;

}

难度:1入门级,2初级,3中级,4高级 内容:
模板调用标记:
1,2,3,4
专业分类 内容:
模板调用标记:
(责任编辑:zengmumu)
    广告位API接口通信错误,查看德得广告获取帮助