(劍指Offer)面試題55:字符流中第一個不重複的字符

题目:

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

思路:

字符流:像流水一样的字符,一去不复返,意味着只能访问一次。

方法1:将字符流保存起来

通过哈希表统计字符流中每个字符出现的次数,顺便将字符流保存在string中,然后再遍历string,从哈希表中找到第一个出现一次的字符;

方法2:哈希表特殊处理

同样通过哈希表来统计字符流中每个字符,不过不是统计次数,而是保存位置,哈希表初始化每个键值对应的value均为-1,如果字符出现一次,则value等于该字符的下标,如果字符出现两次,则value等于-2;这样遍历哈希表时,第一个value大于0的字符就是第一个出现一次的字符;

代码:

参考下面的在线测试代码

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/00de97733b8e4f97a3fb5c680ee10720?rp=3

AC代码:

方法1:

class Solution
{
private:
    string str;
    int count[256]={0};
public:
  //Insert one char from stringstream
    void Insert(char ch)
    {
        str+=ch;
        count[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[str[i]]==1)
                return str[i];
        }
        return '#';
    }

};

方法2:(暂未AC,原因不详)

class Solution
{
private:
    int index;
    int count[256];
public:
    Solution():index(0){
        for(int i=0;i<256;++i)
            count[i]=-1;
    }
  //Insert one char from stringstream
    void Insert(char ch)
    {
        if(count[ch]==-1)
            count[ch]=index;
        else if(count[ch]>=0)
            count[ch]=-2;
        ++index;
    }
  //return the first appearence once char in current stringstream
    char FirstAppearingOnce()
    {
    	int minIndex=numeric_limits<int>::max();
        for(int i=0;i<256;i++){
            if(count[i]>=0 && count[i]<minIndex)
                return char(i);
        }
        return '#';
    }

};
更多相关文章
一周排行
  • 闭包的特性 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变量不会被垃圾回收机制回收  闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露,主要用于私有的方法和变量 Javasc ...
  •   对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - 1) + F(n - 2),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围内的非负
  • 


    		    多目的地址的PIX防火牆nat
    工作中遇到点问题,如果有高手路过,请不吝赐教! 问题描述: 单位原有网络拓扑结构为: 内网
  • 


    		    SCCM2007系列教程之十四在2008上部署SCCM2007
    部署前的准备工作: 1.登陆服务器,打开服务器管理器控制台,点击功能节点,分别安装&quo ...
  • 1.使用tar对文件压缩加密: tar -zcvf - ./test_foldopenssl des3 -salt -k mypassword dd of=test.des3 完成将得到一个pma.des3的打包文件
  • 最近老板提出一个需求,要用Hadoop机群管理生物数据,并且生物数据很多动辄几十G,几百G,所以需要将这些数据传到HDFS中,在此之前搭建了HUE用来图形化截面管理HDFS数据,但是有个问题,上面使用的REST AP
  • When learning a new programming language, it's important to try the examples in the book, and then modify th
  • RemoveDirectoryA( __in LPCSTR lpPathName ); PathFileExistsA(LPCSTR pszPath); CreateDirectoryA(strDirectoryNa
  • 是前向声明还是后向声明? 官方文档那个给出:“the overridable SQL part that will be prepended to the statement”.可见是前向声明. 以下内容转自:htt
  • 1.生成DLL 打开VS2008 - >新建->项目->类库->ClassLibrary1,在ClassLibrary1中会自动创建一个Class1类 class1中加入代码如下: 1 usi ...