【剑指offer】54.字符流中第一个不重复的字符

题目

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

输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。


分析

做这一题时,刚开始对题意的理解有所偏差。认为是寻找字符流中第一次出现的不重复的字符,但是本意是在线处理,寻找当前字符流中第一次不重复的字符。

github链接:JZ54-字符流中第一个不重复的字符


C++代码

#include 
#include 
#include 
using namespace std;

class Solution{
	
	private:
		map<char,int> hash;
		queue<char> letter;
		
	public:
	  //Insert one char from stringstream
	    void Insert(char ch){
	    	this->hash[ch]++;
	    	if(this->hash[ch] == 1){
	    		this->letter.push(ch);
			}
		}
	  //return the first appearence once char in current stringstream
	    char FirstAppearingOnce(){
	    	while(!this->letter.empty() && this->hash[this->letter.front()] >= 2){
	    		this->letter.pop();
			}
			if(this->letter.empty()){
				return '#';
			}else{
				return this->letter.front();
			}
	    }

};

int main()
{
	string str;
	Solution s;
	while(cin>>str){
		for(int i = 0 ; i < str.length() ; i++){
			s.Insert(str[i]);
		}
		cout<<s.FirstAppearingOnce()<<endl;
	}
	
	return 0;
}

你可能感兴趣的:(#,剑指offer题解)