前言
博客里新开一个“用python手刃Leetcode”的专题,顾名思义,主要目的是记录自己在Leetcode上刷题的过程,代码全程用python3编写,所用网址是:leetcode中国。这个网址的好处是:1)纯中文,解决了英语不好读题困难的问题;2)网页打开速度快。
`
同时可以看到:目前官网给出的解题代码是用java编写的,并没有给出官方的python解答,本专栏除了尽量使用多种解法给出每道题的python3解答代码之外,还会记录下自己在做题过程中的一些收获和思考。便于以后复习查阅。
给定一个仅包含大小写字母和空格 ’ ’ 的字符串,返回其最后一个单词的长度。
如果不存在最后一个单词,请返回 0 。
说明:一个单词是指由字母组成,但不包含任何空格的字符串。
示例:
输入: “Hello World” 输出: 5
1、首先,为了理解算法思想,先不调用任何函数手动撸个复杂的,思路如下:首先去除掉字符串末尾的空格:倒着遍历,判断是空格就把字符串长度减一,z直到遇到单词字母。接着从头开始遍历,遇到空格就把start指针移在该空格后的第一个单词上。直到遍历到最后一个单词的尾字母。最后返回n-start(n本来就比末尾索引大一,所以不需要加一了)
class Solution:
def lengthOfLastWord(self, s):
"""
:type s: str
:rtype: int
"""
n = len(s)
i = n-1
while i>= 0:
if s[i].isspace():#也可以:s[i] ==" "
n -= 1
i -= 1
else:
break
if n == 0:return 0
start = 0
for j in range(n):
if s[j].isspace():
start = j+1
return n-start
2、当然,直接设置一个计数器计数也可以。
class Solution(object):
def lengthOfLastWord(self, s):
n = len(s)
i = n-1
while i>= 0:
if s[i].isspace():#也可以:s[i] ==" "
n -= 1
i -= 1
else:
break
counter=0
for i in (s.strip()):
if i == " ":
counter = 0
else:
counter += 1
return counter
当然还有一种思路就是:可以先把字符串反转开始遇到的空格都删掉,从而将start指在遇到的第一个字母删,接着再遇到一个空格返回当前索引和start之间的长度,这个可以自己实现以下。
当然,在实际生活中遇到这种情况,当然没有必要自己费力实现,只需要借助python的了两个函数进行实现。
1) strip()
。这个函数用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列,只要在首尾,有多少删多少。有趣的是,这个单词的意思就是剥光,剥除的意思,充分证明了python函数起名的通俗,生动。
例如:
str = "0000000你好啊0000000";
str.strip( '0' ); # str = "你好啊"
str2 = " 你好啊 "
str2.strip(); #str2="你好啊"
注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
另外,这个函数对于字符串可以不按照顺序匹配:
str = "123你好321231"
print (str.strip( '123' )) # str = "你好"
2)) split()
。这个函数通过按照指定的分隔符对字符串进行切片,并返回一个列表。它的英文意思有切分,切开的意思,命名同样很形象。
使用方法:str.split(str="分隔符", num=分割次数
其中str 默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。也可以自己指定。
用法示例:
str = "你好 啊,我很 好,我们大家都很 好"
str.split(','); # str = ["你好 啊","我很 好","我们大家都很 好"]
str.split(',',1); # str = ["你好 啊","我很 好,我们大家都很 好"]
print str.split() #str = ["你好","啊,我很","好,我们大家都很","好"]
借用这两个函数,这个题可以一行搞定:return len(s.strip().split(" ")[-1])
还是那句话,在实际使用中可以这么用,但是做算法题还是尽量自己手动实现一下,以理解算法思想。