344. 反转字符串
法一:反转之后再逐个修改字符串s
法二:数学归纳法,可以让第一个和最后一个两两交换位置,第二个和倒数第2个两两交换
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
# 法一:
# t = s[::-1]
# for i in range(len(s)):
# s[i] = t[i]
# return s
# 法二:
mid = len(s) // 2
for i in range(mid):
s[i], s[len(s)-1-i] = s[len(s)-1-i], s[i]
return s
541. 反转字符串 II
第一想法:就简单模拟,具体思路见代码注释
class Solution:
def reverseStr(self, s: str, k: int) -> str:
# 记录结果
t = ""
# 遍历字符串s,每次步长为2k
for i in range(0, len(s), 2 * k):
# 两种切片方法取得前k(需翻转)和后k个(无需翻转)
temp = s[i:i+2*k]
temp_1 = temp[:k]
temp_2 = temp[k:]
# temp_1 = s[i:i+k]
# temp_2 = s[i+k:i+2*k]
# 翻转字符串
if len(temp_1) <= k:
temp_1= temp_1[::-1]
# 拼接结果
t += temp_1+temp_2
return t
剑指 Offer 05. 替换空格
第一想法:用replace
class Solution:
def replaceSpace(self, s: str) -> str:
# 法一:
# return s.replace(' ','%20')
# 法二:
n = len(s)
for e,i in enumerate(s[::-1]):
print(i,e)
if i == " ":
s = s[:n - (e + 1)] + "%20" + s[n-e:]
print(f"n-e+1:{n-(e+1)}/{n-e}")
print("")
return s
- 首先扩充数组到每个空格替换成"%20"之后的大小
- 然后从后向前使用双指针法替换空格,i指向新长度的末尾,j指向旧长度的末尾
- i指向空格时,就让j填充% 20,否则就填充i所指向的元素,知道i指向0号元素
class Solution:
def replaceSpace(self, s: str) -> str:
cnt = s.count(' ')
res = list(s)
res.extend([' '] * 2 * cnt)
l, r = len(s)-1, len(res)-1
# 如果,写成while l!=0:会报错, 针对空字符情况“”
while l >= 0:
if s[l] == ' ':
res[r-2:r+1] = '%20'
r -= 3
else:
res[r] = s[l]
r -= 1
l -= 1
return ''.join(res)
151.翻转字符串里的单词
自己的思路:模拟,
- 首先按照空格正序遍历,将每个单词存放到列表中,
- 反转列表
- 将列表中的单词每个+空格
class Solution:
def reverseWords(self, s: str) -> str:
t = list()
temp = ''
for id,i in enumerate(s):
if i == ' ':
if temp != '':
t.append(temp)
temp = ""
else:
temp += i
# 在字符串的末尾也要添加一次,s = "a good example"否则最后一个example无法完整取到
if id == len(s) - 1:
if temp != '':
t.append(temp)
t.reverse()
# 法一:模拟
# ans = ""
# for i in range(len(t)):
# ans += t[i] + ' '
# return ans[:-1]
# 法二:join
res = " ".join(t)
return res
剑指 Offer 58 - II. 左旋转字符串
第一想法:切片
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
return s[n:]+s[:n]
难点:局部翻转和整体翻转