(劍指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 '#';
    }

};
更多相关文章
一周排行
  • 相信做过自动化运维的同学都用过API接口来完成某些动作.API是一套成熟系统所必需的接口,可以被其他系统或脚本来调用,这也是自动化运维的必修课. 本文主要介绍python中调用API的几种方式,下面是python中会 ...
  • 1.PhotoShop縮小圖片的三種方式
    先声明,本人不是高前端的,若有不当或者不合理的地方,还望前端愛好者多多指教.此处只是留作个
  • Using the wrong join condition in a FROM clause causes unpredictable results. If the FROM clause specifies a
  • 实现功能:同Dinic网络最大流 1 这个新的想法源于Dinic费用流算法... 在费用流算法里面,每次处理一条最短路,是通过spfa的过程中就记录下来,然后顺藤摸瓜处理一路 于是在这个里面我的最大流也采用这种模式,
  • 一.简介       JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文
  • 1. Make sure all Office 2010 applications are closed. 2. Open an elevated command prompt: click start, click
  • 导航不善用,非常麻烦,容易走进死循环,抄近路的解决辦法是, 1.重写返回键的时候强制导航到哪个页面: protected override void OnBackKeyPress(CancelEventArgs e)
  • C#编程基础: A1 ………… 基础A2 ………… using 关键字A3 ………… as 关键字A4 ………… is 关键字A5 ………… switch 关键字A6 ………… return 语句关键字A7 …………
  • [算法一] 暴力. 可以通过第0.1号测试点. 预计得分:20分. [算法二] 经典问题:区间众数,数据范围也不是很大,因此我们可以: ①分块,离散化,预处理出: <1>前i块中x出现的次数(差分): & ...
  • 數學圖形(1.47)貝塞爾(B&#233;zier)曲線
          贝塞尔曲线又称贝兹曲线或贝济埃曲线,是由法国数学家Pierre Bézier所