代码随想录算法训练营Day8 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋 | Python | 个人记录向

344.反转字符串

代码随想录:344.反转字符串
Leetcode:344.反转字符串

做题

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

时间复杂度: O(n)
空间复杂度: O(1)

看文章

这个功能用库函数就可以实现,但在实际面试中:

  • 如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。
  • 如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,可以考虑使用库函数。

反转(库函数): s[:] = reversed(s)

541. 反转字符串II

代码随想录:541. 反转字符串II
Leetcode:541. 反转字符串II

做题

分情况,分别实现反转。

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        size = len(s)
        left, right = 0, 0
        a = list(s)
        while right < size:
            if right + 2 * k - 1 < size:
                temp = right + 2 * k
                right = right + k - 1
                while left < right:
                    a[left], a[right] = a[right], a[left]
                    left += 1
                    right -= 1
                left, right = temp, temp
            elif right + k - 1 < size:
                right = right + k - 1
                while left < right:
                    a[left], a[right] = a[right], a[left]
                    left += 1
                    right -= 1
                left, right = size, size
            else:
                right = size - 1
                while left < right:
                    a[left], a[right] = a[right], a[left]
                    left += 1
                    right -= 1
                break
        return ''.join(a)

时间复杂度: O(n)
空间复杂度: O(1)或O(n),取决于使用的语言中字符串是否可以修改,python无法修改,所以说O(n)

看文章

反转操作整理成函数

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        """
        1. 使用range(start, end, step)来确定需要调换的初始位置
        2. 对于字符串s = 'abc',如果使用s[0:999] ===> 'abc'。字符串末尾如果超过最大长度,则会返回至字符串最后一个值,这个特性可以避免一些边界条件的处理。
        3. 用切片整体替换,而不是一个个替换.
        """
        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)

更简洁版

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
            # Written in this could be more pythonic.
            s = s[:p] + s[p: p2][::-1] + s[p2:]
            p = p + 2 * k
        return s

卡码网:54.替换数字

代码随想录:卡码网54.替换数字
卡码网:54.替换数字

做题

思路能想到,但不知道怎么判断是字母还是数字。

看文章

如果使用C++,因为C++的string可以修改,故可以不需要额外空间,实现空间复杂度为O(1)的算法。但Java、Python都是不能修改的。具体代码如下:

class Solution:
    def change(self, s):
        lst = list(s) 
        for i in range(len(lst)):
            if lst[i].isdigit():
                lst[i] = "number"
        return ''.join(lst)

Python中,判断数字的函数是.isdigit(),判断字母的函数是.isalpha()。
时间复杂度: O(n)
空间复杂度: O(n)

151.翻转字符串里的单词

代码随想录:151.翻转字符串里的单词
Leetcode:151.翻转字符串里的单词

做题

字符串的基础函数不熟。

看文章

与上一题一样,python的字符串不可变,故空间复杂度无法做到O(1)。

先删除空白,然后整个反转,最后单词反转

class Solution:
    def reverseWords(self, s: str) -> str:
        # 删除前后空白
        s = s.strip()
        # 反转整个字符串
        s = s[::-1]
        # 将字符串拆分为单词,并反转每个单词
        s = ' '.join(word[::-1] for word in s.split())
        return s

使用双指针

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)

卡码网:55.右旋

代码随想录:卡码网55.右旋
卡码网:55.右旋

做题

k = int(input())
s = input()

res = []
size = len(s)
for i in range(size - k, size):
    res.append(s[i])
    
for i in range(size - k):
    res.append(s[i])
    
print(''.join(res))

看文章

与上一题一样,python的字符串不可变,故空间复杂度无法做到O(1)。

#获取输入的数字k和字符串
k = int(input())
s = input()

#通过切片反转第一段和第二段字符串
#注意:python中字符串是不可变的,所以也需要额外空间
s = s[len(s)-k:] + s[:len(s)-k]
print(s)

以往忽略的知识点小结

  • Python常见库函数:(s是字符串,a是char)
    • 反转:s[:] = reversed(s)
    • 判断数字:a.isdigit()
    • 判断字母:a.isalpha()
    • 去除字符串两端的指定字符(默认为空白字符):s.strip()
    • 将字符串拆分为单词列表:s.split()
  • Python、Java的字符串不可修改,C++可以

个人体会

完成时间:3h30min。
心得:多熟悉Python基础库函数。

  • 27
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值