字符流中第一个不重复的字符(哈希表+vecor+剑指offer)

字符流中第一个不重复的字符
  • 参与人数:742时间限制:1秒空间限制:32768K
  • 通过比例:25.71%
  • 最佳记录:0 ms|8552K(来自  LaZZy)

题目描述

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。

链接:http://www.nowcoder.com/practice/00de97733b8e4f97a3fb5c680ee10720?rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking  

思路:同http://blog.csdn.net/u010579068/article/details/48811619一样,不重复了


关键是搞清楚题目的意思;不懂的看测试样例,我用WA换来的!haha~


#include<cstdio>
#include<vector>
#include<iostream>
using namespace std;
class Solution
{
public:
    Solution()
    {
        for(int i=0;i<256;i++)
        {
            ASCII[i]=0;
        }
        if(!index.empty()) index.clear();

    }
  //Insert one char from stringstream
    void Insert(char ch)
    {
        int tmp=(int)ch;
        ASCII[tmp]++;
        if(ASCII[tmp]==1) index.push_back(tmp);
        FirstAppearingOnce();
    }
  //return the first appearence once char in current stringstream
    char FirstAppearingOnce()
    {
        char ch='#';
        vector<int>::const_iterator iter;
        iter=index.begin();
        while(iter!=index.end())
        {
            int tmp=*iter;
            if(ASCII[tmp]==1) {ch=(char)tmp;break;}
            iter++;
        }
        return ch;
    }
private :
    int ASCII[256];
    vector<int> index;
};
int main()
{
    char st[]="google";
    char *c=st;
    Solution so;
    while(*c!='\0')
    {
#ifndef NDEBUG
        printf("%c",*c);
#endif
        so.Insert(*c);
        c++;
        printf("%c\n",so.FirstAppearingOnce());
    }
    return 0;
}

/***
测试用例:
"google"

对应输出应该为:
"ggg#ll"
*/

其实用队列更好一点。

class Solution
{
public:
    Solution()
    {
        for(int i=0;i<256;i++)
        {
            ASCII[i]=0;
        }
        while(!Q.empty()) Q.pop();

    }
  //Insert one char from stringstream
    void Insert(char ch)
    {
        int tmp=(int)ch;
        ASCII[tmp]++;
        if(ASCII[tmp]==1) Q.push(tmp);
        FirstAppearingOnce();
    }
  //return the first appearence once char in current stringstream
    char FirstAppearingOnce()
    {
        char ch='#';
        while(!Q.empty())
        {
            int tmp=Q.front();
            if(ASCII[tmp]==1) {ch=(char)tmp;break;}
            if(ASCII[tmp]>1) Q.pop();
        }
        return ch;
    }
private :
    int ASCII[256];
    queue<int> Q;
};



你可能感兴趣的:(哈希表,剑指offer,字符流中第一个不重复的字符)