牛客#第一个只出现一次的字符
2018-03-06 16:44
169 查看
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自动排序导致顺序打乱的问题。相关文章推荐
- 九度 题目1283:第一个只出现一次的字符
- 第一个只出现一次的字符
- 面试题35:第一个只出现一次的字符
- 在字符串中找出第一个只出现一次的字符
- 【九度OJ1283】|【剑指offer35】第一个只出现一次的字符
- 字符串中第一个只出现一次的字符
- 面试题35—第一个只出现一次的字符
- 第一个只出现一次的字符
- 两个字符串hash问题:检查两个单词是否互为变位词和在一个字符串中第一个只出现一次的字符
- 求字符串中字符只出现一次的的第一个字符
- [剑指offer]第一个只出现一次的字符位置
- 剑指Offer之 - 第一个只出现一次的字符
- 求字符串中第一个只出现一次的字符
- 剑指offer 面试题35 字符串中第一个出现一次的字符
- 剑指Offer——字符串中第一个只出现一次的字符
- 【笔试】47、第一个只出现一次的字符
- 剑指offer—第一个只出现一次的字符位置
- 面试题35_第一个只出现一次的字符
- 剑指Offer——第一个只出现一次的字符位置
- 第一个只出现一次的字符+数组中重复的数字