字符串不可变,列表可变;不能直接在字符串上修改,要先将字符串转换成列表
有疑问:
s[left], s[right] = s[right], s[left]为啥能直接赋值
344.翻转字符串【双指针法、使用栈,str.reverse()、切片】
【双指针法】 时间复杂度o(n2) 空间复杂度度数O(1)
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
left, right = 0, len(s) - 1
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
【使用栈:先进后出】
class Solution:
def reverseString(self, s: List[str]) -> None:
stack = []
for char in s:
stack.append(char)
for i in range(len(s)):
s[i] = stack.pop()
【使用reverse】
class Solution:
def reverseString(self, s: List[str]) -> None:
s[:] = reversed(s) #或者是 s.reverse()
【使用切片】
class Solution:
def reverseString(self, s: List[str]) -> None:
s[:] = s[::-1]
【reverse和切片的差别】
1.reverse只适用于list,就地修改原列表,不返回新的列表,其返回值是None
2.切片适用于list和str,切片会创建并返回一个新的序列,原序列不会被修改,这对str特别有用
541.反转字符串||
方法一:
class Solution:
def reverseStr(self, s: str, k: int) -> str:
'''
1.range(start,end,step)
2.对于字符串s = 'abc',如果使用s[0:999] ===> 'abc'。
字符串末尾如果超过最大长度,则会返回至字符串最后一个值,这个特性可以避免一些边界条件的处理。
3.用切片替换整体,而不是一个个替换
'''
ss = list(s)
for i in range(0,len(ss),2*k):
ss[i:i+k] = ss[i:i+k][::-1]
return "".join(ss)
【注意】刚开始的时候,我直接在str上操作
str[i:i+k]= str[i:i+k][::-1]这个就是相当于修改str的一部分,但是str是不可变的
方法二:
class Solution:
def reverseStr(self, s: str, k: int) -> str:
# Two pointers. Another is inside the loop.
p = 0
while p < len(s):
p2 = p + k
# Written in this could be more pythonic.
s = s[:p] + s[p: p2][::-1] + s[p2:] #这里其实是创建了一个新的字符串
p = p + 2 * k
return s
卡码网:54.替换数字
ss = input()
rec = ''
for i in ss:
if ord('0')<=ord(i)<=ord('9'):
rec += 'number'
else:
rec += i
print(rec)
151.翻转字符串里的单词
class Solution:
def reverseWords(self, s: str) -> str:
word = s.split()
left ,right = 0,len(word)-1
while left < right :
word[left],word[right] = word[right],word[left]
left += 1
right -= 1
return " ".join(word) #一定要有空格,否则单词间无间断
class Solution:
def reverseWords(self, s: str) -> str:
s = s.strip() # 删除前后空白
s = s[::-1] # 反转整个字符串
# 将字符串拆分为单词,并反转每个单词
s = ' '.join(word[::-1] for word in s.split())
return s
【str.split()和str.strip()区别:】
str.split()把字符串按照默认空格,为分隔符,返回一个列表
str.strip()默认移除str头尾的空白字符串,返回一个新的str
卡码网:55.右旋转字符串
#获取输入的数字k和字符串,!!!【注意k和s是分开获得,两次input()索求得到】
k = int(input())
s = input()
#通过切片反转第一段和第二段字符串
#注意:python中字符串是不可变的,所以也需要额外空间
s = s[len(s)-k:] + s[:len(s)-k]
print(s)