2025/7/4
题目(easy):

我的思路:
显然题目只需要两步:
①找到最后一个单词②返回这个单词的长度
可以倒着找,先找到倒数第一个单词,然后返回这个单词的长度就好了。Python里可以直接按空格切割开这个字符串,然后反向遍历得到第一个不为''的字符串返回其长度就好了
代码如下:
class Solution:
def lengthOfLastWord(self, s: str) -> int:
slist = s.split(' ') #对字符串按空格切割
for i in range(len(slist)-1,-1,-1): #range(开始索引,结束索引的下一位,步长)
if(i == 0):
return len(slist[0])
elif slist[i] != '':
return len(slist[i])
# for i in reversed(slist): #两个是其他的倒着遍历数组的方式,reversed方法可以直接倒转
# print(i)
# for i in slist[::-1]: #[]可以直接切片,:表示省略,[start:end:步长]
# print(i) #start 被省略,表示从默认的起始位置(即列表的第一个元素)开始
#stop 被省略,表示到默认的结束位置(即列表的最后一个元素)结束
时间复杂度:O(n+m) 【其中 n 是字符串 s 的长度,m是分割后slist的长度(最坏情况可能s是“hello "这种】
空间复杂度:O(m) 【其中 m 是分割后的列表 slist 的长度。在最坏情况下(没有空格),m 等于 n,因此空间复杂度也可以认为是 O(n)】
优化思路:
其实不用依赖split函数,并且也不用分割开也可以得到最后一个单词。这样可以节约一点空间,只要倒着查到第一个不为空格的字符然后一直--,直到又到空格了为止。
即①找到倒数第一个单词的结尾②找到倒数第一个单词的开头③结尾索引减去开头索引
代码如下:
class Solution:
def lengthOfLastWord(self, s: str) -> int:
l = len(s)
end = -1 #标记倒数第一个单词结尾的索引位置,为-1表示还没找到
start = -1 #标记倒数第一个单词开头的前一个位置
for i in range(l-1,-1,-1):
if s[i] != ' 'and end == -1:
#找到第一个单词的结尾了
end = i
if s[i] == ' ' and end != -1:
#找到这个单词的开头了(显然这个是单词开头的前一位)
start = i
break
return end-start
时间复杂度:O(n) 【n是s的长度】
空间复杂度:O(1) 【只要了几个临时变量】
总结:
①Python中Split切割,会把需要切割的字符标记切成‘’ 比如(wwwhellowww).split('w')会切割成(‘’,‘’,‘’,‘hello’,‘’,‘’,‘’),但是注意【''】并非空格【‘ ’】。它的时间复杂度是o(n),n是s的长度
②Python中倒着遍历数组有三种方法,分别是直接反转数组的reverse(),直接切割数组的迭代器s[start:end:-1]可以省略成s[::-1],以及range(end;start;-1)倒着数索引。

1047

被折叠的 条评论
为什么被折叠?



