344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格、 151.翻转字符串里的单词、 剑指Offer58-II.左旋转字符串
- 344.反转字符串
采用双指针,一个从前一个从后相互靠近
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
left, right = 0, len(s) - 1
# 该方法已经不需要判断奇偶数,经测试后时间空间复杂度比用 for i in range(right//2)更低
# 推荐该写法,更加通俗易懂
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
- 541.反转字符串II
题目: 反转字符串2
题解:
1)如果是一段一段进行跳跃的,可以每次循环多移动一些,不要拘泥于每次只循环1
2) 可以注意字符串和数组之间的转换
代码:
class Solution(object):
def reverseStr(self, s, k):
"""
:type s: str
:type k: int
:rtype: str
"""
res = list(s)
for i in range(0, len(res), 2 * k):
if i + k <= len(res):
res [i: i + k] = reversed(res[i: i+k])
else:
res[i: len(res)] = reversed(res[i:len(res)])
return ''.join(res)
- 剑指Offer 05.替换空格
题目:替换空格
题解:
1)为了节省空间,直接在原数组上操作吧,在后面补充一些位置,从后往前覆盖。(因为从前往后的移动位数比较多)
2) 注意一些库函数的写法
代码:
class Solution(object):
def replaceSpace(self, s):
"""
:type s: str
:rtype: str
"""
res = list(s)
counter = s.count(' ')###记住
res.extend([' '] * counter * 2)###记住
left = len(s) - 1
right = len(res) - 1
while left < right:
if res[left] == ' ':
res[ right - 2: right + 1] = '%20'###记住 字符数组直接和字符串去比较
right -= 3
else:
res[right] = res[left]
right -= 1
left -= 1
return ''.join(res)
- 151.翻转字符串里的单词
题目:翻转字符串里的单词
题解:
- 要清楚分为三个步骤:首先剔除空格;然后翻转整个字符串;最后翻转单词。
2)可以借助库函数reversed, 前提是要明白这个函数如何实现(使用双指针,一个前一个后的互相交换即可)注意reversed函数的写法,输入输出都
3)剔除空格使用到双指针,快指针去找待替换的值,慢指针去找新的位置。
代码:
class Solution(object):
def reverseWords(self, s):
"""
:type s: str
:rtype: str
"""
def deleteKongge (ss):
slow = 0
fast = 0
while fast < len(ss):
if ss[fast] != ' ' and slow != 0:#当每次遇到一个新的单词,都在它前面加一个空格
ss[slow] = ' '
slow += 1
while fast < len(ss) and ss[fast] != ' ':
ss[slow] = ss[fast]
slow += 1
fast += 1
fast += 1
return ss[:slow]
ss = list(s)
res = deleteKongge(ss) #第一步
res[:] = reversed(res[:])#第二步
temp = 0
for i in range(len(res)):#第三步
if res[i] == ' ':
res[temp : i] = reversed(res[temp : i])#从空格到之前的那个单词翻转
temp = i + 1
res[temp : ] = reversed(res[temp : ])#翻转最后一个单词
return ''.join(res)
- 剑指Offer58-II.左旋转字符串
题目:左旋字符串
题解:
用了比较简单的方法,个人认为没必要搞复杂。