牛客#第一个只出现一次的字符

Description

在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置

Code

之所以记录这道题,倒不是因为这道题难,而是为了记录下这道题在python下的解法。
这道题的常规解法就是遍历字符串,然后存在数组中,统计次数。最后遍历数组,得出第一个只出现了一次的字符。
然而由于python中的dict会自动排序(python2),所以会导致dcba时,输出的是a而不是d。这时,有两种解决办法:

def FirstNotRepeatingChar(self, s):
        # write code here
        keyMap, pos = {}, {}
        for idx, i in enumerate(s):
            if i in pos:
                keyMap[pos[i]] = 0
            else:
                keyMap[idx] = 1
                pos[i] = idx
        for i in keyMap:
            if keyMap[i] == 1:
                return i
        return -1

keyMap存的key value形式为index => count,pos存的key value为char => first index。因为从左到右遍历,index逐渐增大,所以keyMap不用担心被排序,而为了找到某个字符的index,需要从pos字典中获取。比如dcba,keyMap = {0:1, 1:1, 2:1, 3:1},pos = {a:3, b:2, c:1, d:0}。这样keyMap中保留的字符出现的顺序和次数,而不用担心排序会打乱出现的顺序,因为本身就是有序的。
其实keyMap似乎不用dict,用数组也可以...

另一种方法:

def FirstNotRepeatingChar(self, s):
        # write code here
        keyMap = {}
        for idx, i in enumerate(s):
            if i in keyMap:
                keyMap[i] = -1
            else:
                keyMap[i] = idx
        for i in s:
            if keyMap[i] != -1:
                return keyMap[i]
        return -1

不用idx记录顺序了,由于s本身就有原始的顺序,所以再次遍历一边s就好了…

Conclusion

我想到的是第一种,看到别人有第二种解法,顿时心累…不过记录下第一种方法好了,可以用两个dict来解决dict自动排序导致顺序打乱的问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值