代码随想录打卡(8) —— 字符串

力扣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] # 注意左闭右开

你可能感兴趣的:(leetcode,数据结构,算法)