344 反转字符串
题目链接
功能不难实现,但是要求原地修改数组
首先想到list[::-1]直接反序,但是为什么无法修改原数组?是因为此方法使用了额外空间吗?可能是因为我修改了s变量的地址?然后执行时仍然调用了原地址下的数据,因此我必须要在原地址上修改数据,这怎么做到?
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
length = len(s)
for i in range(length-1,-1,-1):
s.append(s[i])
for i in range(length):
s.pop(0)
重写了一个,结果居然最后一组输入超时。。重新思考一下有没有复杂度更低的写法
可以直接把第一个和最后一个交换位置
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
for i in range(int(len(s)/2)):
temp = s[i]
s[i] = s[len(s)-i-1]
s[len(s)-i-1] = temp
ok通过
看了解答之后发现是可以使用切片的,但是必须使用s[:],不能直接对s变量赋值,因为这样赋值会创建一个新变量,而s[:]则不会,通过在jupyter notebook使用id()取变量地址可以验证这一点
541 反转字符串Ⅱ
class Solution:
def reverseStr(self, s: str, k: int) -> str:
s = list(s)
for i in range(0,len(s),2*k):
for j in range(i,min(i+(k//2),len(s))):
if len(s) - i < k:
s[i:] = s[i:][::-1]
break
else:
temp = s[j]
s[j] = s[2*i+k-j-1]
s[2*i+k-j-1] = temp
return ''.join(s)
debug了两次才通过
首先不太熟悉字符串的操作函数,str.join(iterable)操作一个可迭代对象转换为字符串,str为连接字符
其次对题意考虑有误,剩余字符大于k小于2k的情况固然不用管,直接正常交换跳出即可,但小于k时需要单独考虑,否则会列表访问越界
看解答后发现自己犯傻了,可以直接用切片反序的,不用自己调换顺序,被前面那题限制思路了
class Solution:
def reverseStr(self, s: str, k: int) -> str:
s = list(s)
for i in range(0,len(s),2*k):
if len(s) - i < k:
s[i:] = s[i:][::-1]
break
else:
s[i:min(i+k,len(s))] = s[i:min(i+k,len(s))][::-1]
return ''.join(s)
并不需要第二个循环,直接切片反序即可
剑指offer05 替换空格
class Solution:
def replaceSpace(self, s: str) -> str:
s = list(s)
for i in range(len(s)):
if s[i] == ' ':
s[i] = '%20'
return ''.join(s)
简单题,不过我这种遍历替换的方法复杂度这么高吗?只击败了11%的提交者
看一下解答,python的方法很多
首先可以使用双指针法,先扩展空间,然后从后往前移动,遇到空格则填充要求的字符
还可以使用str.split()函数,参数为字符,表示以某个字符为界分割字符串,会删掉参数字符,然后利用str.join函数再以20%连接
还可以直接使用str.replace(a,b)以b替换字符串中的a
151 翻转字符串里的单词
题目链接
这题看似简单,实际上很容易通不过,debug了三次才过。。都是因为多余的空格字符
class Solution:
def reverseWords(self, s: str) -> str:
s = s.split(' ')
while '' in s:
s.remove('')
s = s[::-1]
return ' '.join(s)
关键是要转为列表中去除列表中的空字符元素,不过虽然这样能过,但是时间较长。
注意:split函数默认参数即为空格,在不填入参数使用默认参数时,会自动忽略多个连续的空格,全部删掉而不分割,而如果填入参数’ ‘,则会把两个连续空格之间的空字符都分离出来!!
剑指offer58-Ⅱ 左旋转字符串
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
s = list(s)
for i in range(n):
s.append(s[0])
s.pop(0)
return ''.join(s)
通过了,但是耗时很长。。
看了解答,还是切片法最好用,就一行还快
学习一下reversed函数,参数是一个sequence,包括列表,元组,字符换,range(n)区间等,返回一个逆序序列的迭代器