【力扣题】题目描述:

【Python3】代码:

1、解题思路:遍历字符串,依次判断元素在字符串中的个数是否为1,第一个为1的返回该元素的索引号,若整个字符串都没有个数为1的,则返回-1。

知识点:enumerate(序列):返回可迭代的序列中所有索引号和对应元素,元组形式 (索引, 元素)。

              序列.count(...):统计某元素在序列中的个数。

class Solution:

def firstUniqChar(self, s: str) -> int:

for i,x in enumerate(s):

if s.count(x) == 1:

return i

return -1

2、解题思路:使用计数器统计出字符串中所有元素及其个数,再次遍历字符串,依次判断元素在计数器中的个数是否为1,若是,返回索引,若整个字符串都没有个数为1的,则返回-1。

知识点:collections.Counter(...):计数器,字典子类。统计序列中元素及其出现个数。

              字典[键]:获取字典中键对应的值。或修改键对应的值:字典[键]=值。

class Solution:

def firstUniqChar(self, s: str) -> int:

import collections

adict = collections.Counter(s)

for i,x in enumerate(s):

if adict[x] == 1:

return i

return -1

3、(1)解题思路:使用字典统计出字符串中所有元素及其第一次出现的索引,若重复出现,则该元素在字典中对应的值为-1;再次遍历字典的所有值,在不是-1的值中找出最小的索引号,若没有,返回-1。

知识点:dict():创建空字典。即{ }。

              len(序列):获取序列的长度。

              字典.values():返回可迭代的字典中的所有值。

class Solution:

def firstUniqChar(self, s: str) -> int:

adict = dict()

n = len(s)

for i,x in enumerate(s):

if x in adict:

adict[x] = -1

else:

adict[x] = i

first = n

for i in adict.values():

if i != -1 and i < first:

first = i

if first == n:

return -1

return first

 (2)解题思路:使用字典统计出字符串中所有元素及其第一次出现的索引,若重复出现,则该元素在字典中对应的值为字符串总长度加索引(方便后面获取最小值);再次遍历字典的所有值,找出最小的索引号。

知识点:min(...):获取最小值。

class Solution:

def firstUniqChar(self, s: str) -> int:

adict = dict()

n = len(s)

for i,x in enumerate(s):

if x in adict:

adict[x] = i + n

else:

adict[x] = i

result = min(adict.values())

return -1 if result > n else result

4、解题思路:使用字典统计出字符串中所有元素及其第一次出现的索引,若重复出现,则该元素在字典中对应的值为-1;使用队列依次以元组形式记录元素及其第一次出现的索引号,若是重复的元素从队列移除。最终队列为空,则返回-1,否则返回队列第一个元素中记录的索引号。

知识点:collections.deque():双端队列。左端进,右端出。也可以右端进,左端出。

              队列.append():从队尾(右端)添加一个元素。

              队列.popleft():从队头(左端)移除一个元素,并返回该元素。

class Solution:

def firstUniqChar(self, s: str) -> int:

import collections

adict = dict()

n = len(s)

q = collections.deque()

for i,x in enumerate(s):

if x not in adict:

adict[x] = i

q.append((s[i],i))

else:

adict[x] = -1

while q and adict[q[0][0]] == -1:

q.popleft()

return -1 if not q else q[0][-1]

5、解题思路:从字符串中依次筛选出所有出现次数为1的元素,列表形式记录,若空列表,则没有不重复的元素,返回-1,否则返回列表中第一个元素在字符串中对应的索引号。【该方法超出时间限制】

知识点:filter(predict, 可迭代对象):返回一个迭代器。筛选出所有符合条件的元素。

              lambda:匿名函数。

              序列.index(...):获取元素在序列中的索引号。

              序列[索引]:获取序列中索引号对应的元素。

class Solution:

def firstUniqChar(self, s: str) -> int:

# 超出时间限制

alist = list(filter(lambda x:s.count(x)==1,s))

return -1 if len(alist)==0 else s.index(alist[0])

改进:遍历字符串,依次判断元素出现的次数是否为1,从字符串中过滤掉不满足条件的元素,获取第一个满足条件的元素及之后所有元素,列表形式记录,若空列表,则返回-1,否则返回列表中第一个元素在字符串中对应的索引号。

知识点:itertools.dropwhile(predict, 可迭代对象):返回一个迭代器。依次遍历可迭代对象,不满足条件的内容去除,第一个满足条件的内容及其之后所有内容全部返回。

class Solution:

def firstUniqChar(self, s: str) -> int:

import itertools

alist = list(itertools.dropwhile(lambda x:s.count(x)!=1, s))

return -1 if len(alist)==0 else s.index(alist[0])

好文阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。