【剑指offer】JZ75 字符流中第一个不重复的字符

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. 哈希表+字符串

又是一个找到是否重复的问题。我们还是可以用哈希表来记录各个字符出现的次数,根据这样只要是字符串最前面且哈希表中次数为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,则返回该字符,如果不为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

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LouHerGetUp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值