题目描述:
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
思路:
准备两个集合,一个列表
集合一存只出现一次的字符
集合二存出现大于一次的字符
列表按顺序存只出现一次的字符
新字符来时:
如果不在集合一和集合二中,就加入到列表中,同时加入到结合一种
如果在集合一中,就从集合一中移除,并将其从列表中移除,集合二加入该字符
如果在集合二中,不处理
代码:
class Solution:
# 返回对应char
def __init__(self):
self.set_1 = set()
self.set_2 = set()
self.l = []
def FirstAppearingOnce(self):
# write code here
if not self.l:
return '#'
else:
return self.l[0]
def Insert(self, char):
# write code here
if char not in self.set_1 and char not in self.set_2:
self.l.append(char)
self.set_1.add(char)
elif char in self.set_1:
self.set_2.add(char)
self.set_1.remove(char)
for i in range(len(self.l)):
if self.l[i] == char:
self.l.pop(i)
break
思路2:
节约一个set,但是需要花费更多时间
set中存出现超过两次的字符
l中存只出现一次的字符
代码2
class Solution:
# 返回对应char
def __init__(self):
self.l = []
self.s = set()
def FirstAppearingOnce(self):
# write code here
if not self.l:
return '#'
else:
return self.l[0]
def Insert(self, char):
# write code here
if char in self.s:
pass
elif char in self.l:
self.s.add(char)
self.l.remove(char)
else:
self.l.append(char)