题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"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; };