1 问题
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符 “go” 时,第一个只出现一次的字符是 “g” 。当从该字符流中读出前六个字符 “google" 时,第一个只出现一次的字符是"l"。
数据范围:字符串长度满足 1≤n≤1000 ,字符串中出现的字符一定在 ASCII 码内。
进阶:空间复杂度 O(n) ,时间复杂度 后台会用以下方式调用 Insert 和 FirstAppearingOnce 函数
string caseout = "";
1.读入测试用例字符串casein
2.如果对应语言有Init()函数的话,执行Init() 函数
3.循环遍历字符串里的每一个字符ch {
Insert(ch);
caseout += FirstAppearingOnce()
}
2. 输出caseout,进行比较。
返回值描述:如果当前字符流没有存在出现一次的字符,返回#字符。
示例1
输入:“google”
返回值:“ggg#ll”
示例2
输入:“abcdee”
返回值:“aaaaaa”
2 答案
自己写的
class Solution:
def __init__(self) -> None:
self.hashmap = {}
def FirstAppearingOnce(self):
for key in self.hashmap: # python 3.7 之后字典有序
if self.hashmap[key] == 1:
return key
return '#'
def Insert(self, char):
self.hashmap[char] = self.hashmap.get(char, 0) + 1
官方解
- 哈希表+字符串
又是一个找到是否重复的问题。我们还是可以用哈希表来记录各个字符出现的次数,根据这样只要是字符串最前面且哈希表中次数为1的字符就是我们要找的。
- step 1:准备一个字符串来记录输入的字符流,用哈希表统计每个字符的次数,二者都是全局变量。
- step 2:在Insert函数中对输入的字符,加到字符串最后,然后统计出现次数。
- step 3:在FirstAppearingOnce函数遍历该字符串,对于每个字符查找哈希表,返回第一个计数为1的字符,如果遍历完字符串以后都没,则返回#。
class Solution:
def __init__(self):
self.s = ""
self.mp = dict()
def FirstAppearingOnce(self):
#遍历字符串
for c in self.s: # 遍历字符串保证字典无序也可以使用
#找到第一个出现次数为1的
if self.mp[c] == 1:
return c
#没有找到
return '#'
def Insert(self, char):
#插入字符
self.s += char
#哈希表记录字符出现次数
if char in self.mp:
self.mp[char] += 1
else:
self.mp[char] = 1
- 哈希表+队列
除了使用字符串记录字符流,还可以用队列记录字符流,每次插入的时候,只需要将第一次出现的字符加入到队列中,然后正常计数。
查找第一个不重复出现的字符的时候,从队首开始查询哈希表,如果出现次数为1,则返回该字符,如果不为1,则从队首将其弹出,因为反正后续也不可能是这个已经重复的字符了。
- step 1:准备一个队列来记录输入的字符流,用哈希表统计每个字符的次数,二者都是全局变量。
- step 2:在Insert函数中对输入的字符,加到队列最后,然后统计出现次数。
- step 3:在FirstAppearingOnce函数中,不断检查队首元素直到队列为空,队首出现次数为1次,就返回,队首出现次数不为1就弹出。
class Solution:
def __init__(self):
self.q = []
self.mp = dict()
def FirstAppearingOnce(self):
while len(self.q) != 0:
if self.mp[self.q[0]] == 1:
return self.q[0]
else:
self.q.pop(0)
return '#'
def Insert(self, char):
#哈希表记录字符出现次数
if char in self.mp:
self.mp[char] += 1
else:
self.mp[char] = 1
#插入字符
self.q.append(char)
https://www.nowcoder.com/share/jump/9318638301700971786007