50-02 字符流中第一个只出现一次的字符

题目

找出字符流中第一个只出现一次的字符。例如,当从字符流google中只读出前两个字符go时,第一个只出现一次的字符是g;当读完google时,第一个只出现一次的字符是l。

C++ 题解

此题的关键在于“字符流”。因此最好能够记住在哪个位置出现了哪个字符,从而可以完成每读到一个字符,就能动态更新到目前为止第一个出现一次的字符。
此题同样使用了长度为256的int数组作为哈希表,用字符的ascii码值作为表的键值,当字符仅出现了一次,就把字符的位置作为哈希表的值,如果没有出现则值为-1,如果出现的次数大于1则哈希表对应的值为-2。
当想要知道到某一位置时第一个出现一次的字符,可以通过扫描该哈希表,找到大于等于0的值中的最小值,该值所对应的字符就是当前状态第一个出现一次的字符。

class CharStatistics
{
public:
	CharStatistics() : index(0)
	{
		for (int i = 0; i < 256; ++i)
			occurrence[i] = -1;
	}

	void Insert(char ch)
	{
		if (occurrence[ch] == -1)
			occurrence[ch] = index;
		else if (occurrence[ch] >= 0)
			occurrence[ch] = -2;

		index++;
	}

	char FirstAppearingOnce()
	{
		char ch = '\0';
		int minIndex = numeric_limits<int>::max();
		for (int i = 0; i < 256; ++i)
		{
			if (occurrence[i] >= 0 && occurrence[i] < minIndex)
			{
				ch = (char)i;
				minIndex = occurrence[i];
			}
		}

		return ch;
	}

private:
	// occurrence[i]: A character with ASCII value i;
	// occurrence[i] = -1: The character has not found;
	// occurrence[i] = -2: The character has been found for mutlple times
	// occurrence[i] >= 0: The character has been found only once
	int occurrence[256];
	int index;
};

python 题解

# -*- coding:utf-8 -*-
class Solution:
    # 返回对应char
    def __init__(self):
        # 引入两个辅助空间:alist数组存储当前读入字符流的字符(按顺序)
        # char_dict存储字符出现的次数,如果字符出现大于1次,为简单起见,统一记为2次。
        self.alist=[]
        self.char_dict={}
    def FirstAppearingOnce(self):
        # write code here
        while len(self.alist)>0 and self.char_dict[self.alist[0]]>1:
            self.alist.pop(0)
        if len(self.alist)>0:
            return self.alist[0]
        return '#'
        
    def Insert(self, char):
        # write code here
        if char not in self.char_dict.keys():
            self.char_dict[char]=1
            self.alist.append(char)
        else:
            self.char_dict[char]=2
posted @ 2019-03-16 22:02  youngliu91  阅读(159)  评论(0编辑  收藏  举报