剑指offer--面试题55:字符流中第一个不重复的字符

 

题目描述

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"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

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值