strip()
x=' bab '
x=x.strip()
print('the result is'+x+'.')
//the result is bab.
strip默认删去前后的空格,如果指明是某个字符,那么strip删除的是开始或者结尾这两个字符(如果有):
x='bab'
x=x.strip('b')
print('the result is '+x+'.')
//the result is a.
x=' bab '
x=x.strip('b')
print('the result is '+x+'.')
//the result is bab .
x='ba'
x=x.strip('b')
print('the result is '+x+'.')
//the result is a.
这个对字符串的操作可以使一些实际场景很好完成,例如Leetcode 58 Length of Last Word。
我本身的解决方法是:
if len(s)==0: return 0
pointer=len(s)-1
last_str=''
while pointer>=0:
if s[pointer]!=' ':
last_str+=s[pointer]
elif last_str!='':
break
pointer-=1
return len(last_str)
使用了Strip后的算法代码可简化为:
s=s.strip()split(" ")
return len(s[-1])
join()
Join可将多个元素合并连接在一起,成为一个字符串。
myTuple = ("John", "Peter", "Vicky")
x = "#".join(myTuple)
print(x)
//John#Peter#Vicky
很多场景和题目中,对于字符串的变换和操作多变,不同方法的差距的效率很大。比如Leetcode 66 Plus One。
我最初的解法是:
if digits[-1]!=9:
digits[-1]=digits[-1]+1
elif len(digits)==1:
digits=[1,0]
else:
digits[-1]+=1
i=len(digits)-1
while i>=1 and digits[i]==10:
digits[i]=0
digits[i-1]=digits[i-1]+1
i-=1
if digits[0]==10:
digits[0]=0
digits.insert(0,1)
return digits
虽然被接受了,但是时间效率只超过了5%的Python Submission。。。再思考一遍,其实没有必要对这么多情况分类讨论,可以动态的把这个加一操作看成对数组的整体操作,所以更改代码如下:
carry=1
i=len(digits)-1
while i >=0:
cur=digits[i]+carry
digits[i]=cur%10
carry=cur//10
if not carry: break
i-=1
if carry:
digits.insert(0,1)
return digits
结果只进步了百分之三。。。忽然想到Python对字符串的操作效率更高,所以很多大数问题转换成字符串进行操作都是比较好的做法。于是改进算法的流程如下:
num_list=[str(x) for x in digits]
str_list=''.join(num_list)
integer=int(str_list)
integer+=1
result=map(int,str(integer))
res=[y for y in result]
return res
已经超过了28%的提交运行时间呢!可以说是有大幅提升了吧(bushi)~
可惜目前还没看到讨论区有更快的Python做法,一个说超过了90%的做法也和这个方法类似,但我跑出来就只有30%。不知道是不是我的XP反应太慢了,导致输在了起跑线上哈哈😊
reduce()
reduce(function,sequence)是对sequence实现某种从左到右的function操作。
Leetcode 136
class Solution:
def singleNumber(self, nums: List[int]) -> int:
return reduce(lambda x,y: x^y,nums)