题目描述
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
目标就是找到第一个不重复的字符,那么肯定是需要将字符串全部走一边的,那么根据键统计次数是一个比较好的选择,但又因为是输出索引,所以可以在值中记录两个东西次数和索引
def fun1(s):
# 创建字典
dic = {}
# 开始对_str进行循环
for i in range(len(s)):
a = s[i]
if a in dic:
# 判断的是键是否在字典中
# 能进来说明在
# 让字典键对应的值变为其他
dic[a][0]+=1
else:
# 能进来说明不在
dic[a] =[1,i]
for item in dic.items():
if item[1][0]==1:
return item[1][1]
# 如果循环结束还是没有则输出
return -1
这种是说只遍历一边,你也可以遍历两边
分别存储索引或次数
次数
class Solution:
def firstUniqChar(self, s: str) -> int:
dic={}
for i in s:
if i in dic:
dic[i]+=1
else:
dic[i]=1
#出来的时候已经遍历了一遍,次数已经统计完毕
for i in range(len(s)):
if dic[s[i]]==1:
return i
return -1
索引
class Solution:
def firstUniqChar(self, s: str) -> int:
dic={}
for i in range(len(s)):
a=s[i]
if a in dic:
dic[a]=None
else:
dic[a]=i
for i in dic.items():
if i[1]!=None:
return i[1]
return -1
还有一种方法是使用了队列的,用其来代替第二次的循环.只是一种实现方式,个人认为对于时间,空间上没什么改进.它这个是使用了一种[延迟删除]的方法,就是因为如果不是首位的话是不会影响到最后的结果的,然后每一次都将队列遍历一边.
说些题外话
这里面的很多想法我都想到了,比如队列,比如hash记录,但是最后我都没有写出来,因为我在刚开始的时候过度的追求时间上的完美,所以以后想到一个方法,在认识到他的可行性之后第一遍写不要想让他一定多完美,毕竟后面是可以改的