代码随想录算法训练营第八天| 344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词、剑指Offer58-I

123 阅读2分钟

Leetcode 344 Reverse String

1. 第一想法:

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        l, r = 0, len(s) - 1
        while l < r:
            temp = s[l]
            s[l] = s[r]
            s[r] = temp
            l += 1
            r -= 1

2. 看完后想法

原来 Python 可以直接 s[l], s[r] = s[r], s[l]

3. 总结

其实我没想到直接用库函数....

Leetcode 541 Reverse String II

1. 第一想法

这个题目要求好复杂。

2. 看完后想法

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        def reverse_substring(text):         
            left, right = 0, len(text) - 1
            while left < right:
                text[left], text[right] = text[right], text[left]
                left += 1
                right -= 1
            return text
        
        res = list(s)
        
        for cur in range(0, len(s), 2*k):
            res[cur: cur + k] = reverse_substring(res[cur: cur + k])
        
        return ''.join(res)

3. 总结

每次移动2 * k判断是否有需要反转的区间。

剑指Offer 05 替换空格

1. 第一想法

class Solution:
    def replaceSpace(self , s: str) -> str:
        res = ""
        for c in s:
            if c ==" ":
                res += "%20"
            else:
                res += c
        return res

2. 看完后想法

class Solution:
    def replaceSpace(self, s: str) -> str:
        counter = s.count(' ')
        
        res = list(s)
        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:
                res[right - 2: right + 1] = '%20'
                right -= 3
            left -= 1
        return ''.join(res)

3. 总结

先扩容数组再向前填充。

Leetcode 151 Rerverse Words in a String

1. 第一想法

class Solution:
    def reverseWords(self, s: str) -> str:
        l = s.split(' ')
        r = l[::-1]
        res = [elem for elem in r if elem.strip()]
        return ' '.join(res)

2. 看完后想法

class Solution:
    def reverseWords(self, s: str) -> str:
        words = s.split()
        
        left, right = 0, len(words) - 1
        while left < right:
            words[left], words[right] = words[right], words[left]
            left += 1
            right -= 1
        
        return " ". join(words)

3. 总结

常看常新。

剑指Offer58-II 左旋转字符串

1. 第一想法

牛客上的58似乎不和这题完全一样,海外版没有这题。

2. 看完后想法

class Solution:
    def reverseLeftWords(self, s: str, n: int) -> str:
        return s[n:] + s[:n]

3. 总结

常看常新。