代码随想录day8:字符串01(反转字符串1&2,替换数字,翻转单词,右旋转字符串)

1. 反转字符串(leetcode 344)

这题非常的简单直观,我们用双指针就可以轻易写出。

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

切片法: 

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        s[:] = s[::-1]

遍历法:

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        n = len(s)
        for i in range(n // 2):
            s[i], s[n - i - 1] = s[n - i - 1], s[i]

2. 反转字符串 2(leetcode 541)

这题我们也是向上一题一样用双指针法,只是让遍历的频率变得2k一次,逻辑都是一样的。

这题虽然有两个loop,但要记得时间复杂度是O(n)。

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

        s = list(s)

        if len(s) < k:
            return "".join(reverse_substring(s))  #处理s长度小于k的情况

        for i in range(0,len(s), 2*k):             #s长度大于k的情况
            s[i:i+k] = reverse_substring(s[i:i+k])
        return ''.join(s)

3. 替换数字(KamaCoder 54)

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。

输入描述

输入一个字符串 s,s 仅包含小写字母和数字字符。

输出描述

打印一个新的字符串,其中每个数字字符都被替换为了number

输入示例
a1b2c3
输出示例
anumberbnumbercnumber

由于我们python有.isdigit()这个非常方便的字符串内置函数,因此我们可以直接用。同时我们也可以用ASCIL的方法做。要记住由于字符串是immutable的,我们要先把他变成list

class Solution:
    def change(self, s):
        lst = list(s) 
# Python里面的string也是不可改的,所以也是需要额外空间的。空间复杂度:O(n)。
        for i in range(len(lst)):
            if lst[i].isdigit():
                lst[i] = "number"
        return ''.join(lst)

4. 反转字符串里的单词(leetcode 151)

这题用python来写也比较简单,因为split函数可以直接帮我们消除多余的空格,得到只有单词的数组。

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)

5. 右旋转字符串(KarmaCoder 55)

这题由于python无法更改字符串,所以我们只能申请额外空间来做。


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

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

今天的题目分析较为简单,是因为由于python的字符串不可变,同时python也有很多好用的built in function能帮我们很好的处理字符串和数组,因此我们的很多思路和方法无法达到卡哥的要求,对字符串进行那么细致的操作。关于其它语言的写法以及思路请详见代码随想录。

 

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值