344. 反转字符串
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
i = 0
j = len(s) - 1
while i < j:
s[i], s[j] = s[j], s[i]
i += 1
j -= 1
541. 反转字符串 II
def reverseStr(self, s: str, k: int) -> str:
lists = list(s)
n = len(s)
t = n // (2 * k)
for i in range(t+1):
start = i*2*k
end = min(n-1, start+k-1)
while start < end:
lists[start], lists[end] = lists[end], lists[start]
start += 1
end -= 1
return ''.join(lists)
剑指 Offer 05. 替换空格
很直接用到字符串分割的函数
def replaceSpace(self, s: str) -> str:
s = s.split(' ')
return '%20'.join(s)
随想录的方法
- 首先扩充数组到每个空格替换成"%20"之后的大小。
- 然后从后向前替换空格,也就是双指针法
def replaceSpace(self, s: str) -> str:
counter = s.count(' ')
res = list(s)
# 每碰到一个空格就多拓展两个格子,1 + 2 = 3个位置存’%20‘
res.extend([' '] * counter * 2)
# 原始字符串的末尾,拓展后的末尾
left, right = len(s) - 1, len(res) - 1
while left >= 0:
if res[left] != ' ':
res[right] = res[left]
right -= 1
else:
# [right - 2, right), 左闭右开
res[right - 2: right + 1] = '%20'
right -= 3
left -= 1
return ''.join(res)
151. 反转字符串中的单词
def reverseWords(self, s: str) -> str:
s = [i for i in s.strip().split(' ') if i != '']
start = 0
end = len(s) - 1
while start < end:
if s[start] == '':
print(start)
start += 1
continue
if s[end] == '':
end -= 1
continue
s[start], s[end] = s[end], s[start]
start += 1
end -= 1
return ' '.join(s)
法二:
- 双指针法去除空格(def 内定义 范围无空格的英文)
- 翻转整个字符串
- 翻转各个单词
剑指 Offer 58 - II. 左旋转字符串
用三次反转的思路,不占用额外空间,实现旋转
记得字符串也是可切片操作的
def reverseLeftWords(self, s: str, n: int) -> str:
# reverse
#s = list(s)
#s1 = list(reversed(s[:n]))
#s2 = list(reversed(s[n:]))
#s = reversed(s1 + s2)
#return ''.join(s)
return s[n:]+s[:n]