题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
python实现:
# -*- coding:utf-8 -*-
class Solution:
MAXINT = 2**31-1
def __init2__(self):
self.charAsc2IdxHash = [-1]*256#键值是asc码值,值是该字符的下标,-1表示还没出现过,-2表示出现过且已经发生重复
self.index = 0
# 返回对应char
def FirstAppearingOnce2(self):
# write code here
#注意,扫面整个哈希表,下标满足>=0(说明出现过)并且下标值最小的即为第一个
firstIdx = Solution.MAXINT
for i in range(256):
if self.charAsc2IdxHash[i]>=0 and self.charAsc2IdxHash[i]<firstIdx:
firstIdx = self.charAsc2IdxHash[i]
result = chr(i)
if 0<=firstIdx<=255:
return result
else:
return "#"
def Insert2(self, char):
# write code here
if self.charAsc2IdxHash[ord(char)]==-1:#还没出现过
self.charAsc2IdxHash[ord(char)] = self.index
elif self.charAsc2IdxHash[ord(char)]>=0:#已经出现过,此时重复
self.charAsc2IdxHash[ord(char)] = -2
self.index += 1
# 写法2:直接使用dict
def __init__(self): # 不要把hash和index放在__init__外面写成类变量,不然多次调用函数时会互相影响
self.hash = dict() # 键:字符 值:字符的位置
self.index = 0 # 标识字符的位置
def FirstAppearingOnce(self):
# write code here
if len(self.hash) == 0:
return '#'
first_occur_idx = 2**31-1 # maxint
result = None
for k,v in self.hash.items():
if v>=0 and v<first_occur_idx: # v<0说明该字符已经出现过
first_occur_idx = v
result = k
if result:
return result
return '#'
def Insert(self, char):
# write code here
if self.hash.get(char) is None: # 没出现过
self.hash[char] = self.index
elif self.hash.get(char)>=0: # char已经出现过
self.hash[char] = -1 # -1标识已经出现过
self.index += 1