本文主要是介绍剑指offer:字符流中第一次只出现一次的字符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
思路:
这道题与第一次只出现一次的字符的区别是字符流一去不复返,不能遍历两次,所以如果要用同样的方法,需要用一个字符串string保存下读出的字符,这样就又消耗了O(N)的空间。
换一种思路,还是用hash[256],字符的ASCII 码做下标,但是保存的值不是元素出现的次数,而是元素的下标。hash表初始化为-1,第一次依次读取字符流中的字符,若字符对应的值为-1,代表没有出现过,将值修改为字符的下标,若字符对应的值为大于等于0的数,说明已经出现过,将值设为-2,代表出现了不止一次。这样第二次就不用遍历字符串,而是遍历哈希表,找到最小的大于等于0的下标,对应这个下标(下标大于等于0的说明只出现一次,下标越小,说明越早出现)的就是第一个只出现一次的字符的ASCII码。
class Solution
{
public:int hash[256];int index;//直接初始化有错,要用构造函数Solution():index(-1){for(int i=0;i<256;i++){hash[i]=-1;}}//Insert one char from stringstreamvoid Insert(char ch){index++;if(hash[ch]==-1)hash[ch]=index;else if(hash[ch]>=0)hash[ch]=-2;}//return the first appearence once char in current stringstreamchar FirstAppearingOnce(){char key='#';int value=INT_MAX;for(int i=0;i<256;i++){if(hash[i]>=0&&hash[i]<value){key=char(i);value=hash[i];}}return key;}
};
这篇关于剑指offer:字符流中第一次只出现一次的字符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!