力扣344.反转字符串
要求复杂度为O(1),所以反转方法为本体考点。能想到用双指针思路后,代码编写很简单。 注意不论奇偶长度数组,循环都可以在length//2的位置截至。
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
# 双指针模拟交换过程
length = len(s)
left = 0
right = length - 1
while left < length // 2:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
力扣541.反转字符串Ⅱ
非常巧妙的指针,使得代码看起来非常简洁。主要理清第一次循环时指针的位置,比较容易理解。
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 # 指针移动k
# Written in this could be more pythonic.
s = s[:p] + s[p: p2][::-1] + s[p2:] # 第一轮p:p2对应前k个元素,且只反转前k个
p = p + 2 * k
return s
剑指 Offer 05. 替换空格
调用库函数暴力法外,为了减少空间,首先扩充数组到每个空格替换成"%20"之后的大小,
然后从后向前替换空格,也就是双指针法。详见代码随想录
class Solution:
def replaceSpace(self, s: str) -> str:
return str("%20".join(list(s.split(" "))))
力扣151.反转字符串中的单词
得益于python函数。 否则,思路为,先删除多余的单词间空格,然后颠倒每个单词,再反转整个字符串
class Solution:
def reverseWords(self, s: str) -> str:
# method 1 - Rude but work & efficient method.
s_list = [i for i in s.split(" ") if len(i) > 0] # 提取单词(split后转list格式)
return " ".join(s_list[::-1]) # join后转化为字符串形式
剑指 Offer 58 - II. 左旋转字符串
切片很easy
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
return s[n:] + s[:n] # 注意左闭右开