53字符流中第一个不重复的字符

题目描述

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
思路:开始以为这一道题有很流弊的解法,把自己想的unordered_map的方法放在一边,其实就是使用一个256大的数组模拟哈希就行了,每次插入记得统计目前该字符有多少个了,然后遍历一边这个vector,就可以找到第一个出现的。不过需要注意只对一个类进行操作。
自己的错误点还是很多的:首先是
1)在类里面vector<int> v(10),直接声明10个元素大小的数组是错误的,必须使用=或者{},vector<int> v = vector<int> (10,0);
2)这个是思维上的漏洞错误:看第7行的for循环,这个类有一个string,vector,每次插入一个字符,vector都从0开始统计字符串,比如g,v[g] = 1,然后插入一个o,统计的时候还是从string的0位置开始,即v[g] = 2,这个就是自己的思维错误了,应该每次进入for循环统计前都需要将数组置为0.
当然最简单的方法是每次插入的时候就直接统计出现次数,这样可以控制字符第一次出现的时候才 进行统计。
 1 class Solution{
 2 public:    
 3     void Insert(char ch){
 4         src.insert(src.end(),ch);
 5     } 
 6     char FirstAppearingOnce(){
 7         for(int i = 0;i < src.size();++i){//这里出错
 8             ++v[src[i]];
 9         }
10         for(int i = 0;i < src.size();++i){
11             if(v[src[i]] == 1){
12                 return src[i];
13             }
14         }
15         return '#';
16     }
17 private:
18     vector<int> v = vector<int> (256);
19     string src;   
20  };

标准答案:

class Solution{
public:
  //Insert one char from stringstream     
    void Insert(char ch){
        src.insert(src.end(),ch);
        ++v[ch];
    }
  //return the first appearence once char in current stringstream
    char FirstAppearingOnce(){      
        for(int i = 0;i < src.size();++i){
            if(v[src[i]] == 1){
                return src[i];
            }
        }
        return '#';
    }
private:
    vector<int> v = vector<int> (256,0);
    string src;    
};

 

 

posted @ 2018-01-16 11:04  zqlucky  阅读(127)  评论(0编辑  收藏  举报