代码随想录算法训练营第八天 | 字符串part01:344.反转字符串,541. 反转字符串II,卡码网:54.替换数字,151.翻转字符串里的单词,卡码网:55.右旋转字符串

344.反转字符串​​​​​​​

题目:

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例 1:

输入:s = ["h","e","l","l","o"]

输出:["o","l","l","e","h"]

示例 2:

输入:s = ["H","a","n","n","a","h"]

输出:["h","a","n","n","a","H"]

思路:

  1. 不能用切片,因为会产生新的数组
  2. 利用翻转

s.reverse()

代码:

1、reverse

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

2、双指针

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

        for _ in range(n):
            while left<right:
                s[left],s[right]=s[right],s[left]
                left += 1
                right -= 1
            return s

541. 反转字符串II

题目:

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。

如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

s只由小写字母组成。

示例 1:

输入:s = "abcdefg", k = 2

输出:"bacdfeg"

示例 2:

输入:s = "abcd", k = 2

输出:"bacd"

思路:

先建立一个函数,用于反转前k个字符,再以步长为2k进行遍历。

对于range的用法又加深了理解,步长的方式不常用,但在这里很好用。
range(stop)
range(start, stop, step)

参考了B站视频:(是我能看懂的版本)python版本本题讲解icon-default.png?t=N7T8https://www.bilibili.com/video/BV1MA4y1D76y/?spm_id_from=333.337.search-card.all.click&vd_source=ccf1e621d305550bc54e6d9de4d791ee 

代码:

class Solution:
    # 自己写一个函数,用于反转
    def reverse_sub(self, text):
        n = len(text)
        left = 0
        right = n - 1
        while left < right:
            text[left], text[right] = text[right], text[left]
            left += 1
            right -= 1
        return text

    def reverseStr(self, s: str, k: int) -> str:
        l = list(s)  # 把字符串转为列表
        for i in range(0, len(l) - 1, 2 * k):  # 这一步很关键,用上了步长
            l[i:i + k] = self.reverse_sub(l[i:i + k])  # 这一步也很关键,用了切片,引用了上面的函数
        return ''.join(l)  # 这里也很重要,上面是列表,输出得是字符串

卡码网:54.替换数字

题目:

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

输入:

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

输出:

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

输入示例

a1b2c3

输出示例

anumberbnumbercnumber

思路:

利用正则表达式,sub替换数字为number

代码:

import re

s = input()
l = re.sub('\d', 'number',s)

print(l)

151.翻转字符串里的单词

题目:

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = "the sky is blue"

输出:"blue is sky the"

示例 2:

输入:s = "  hello world  "

输出:"world hello"

解释:反转后的字符串中不能存在前导空格和尾随空格。

示例 3:

输入:s = "a good   example"

输出:"example good a"

解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

提示:

1 <= s.length <= 104

s 包含英文大小写字母、数字和空格 ' '

s 中 至少存在一个 单词

代码:

1、凭直觉写的没有很高的技术含量的方式

class Solution:
    def reverseWords(self, s: str) -> str:
        l = s.split()  # 这行很重要!  这个方法可以将字符串按照空格分割开,还会去掉多余的空格
        l=l[::-1]
        return ' '.join(l)

2、双指针,越用越熟练

class Solution:
    def reverseWords(self, s: str) -> str:
        s = s.split()

        left = 0
        right = len(s) - 1

        while left < right:
            s[left], s[right] = s[right], s[left]
            left += 1
            right -= 1
        return ' '.join(s)

 

卡码网:55.右旋转字符串

题目:

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。

例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。

输入描述

输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。

输出描述

输出共一行,为进行了右旋转操作后的字符串。

输入示例

2

abcdefg

输出示例

fgabcde

思路:

利用切片

代码:

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

n = len(s)
if n<=k:
    print()

result = s[n - k:n] + s[0:n - k]  # 第一遍写的时候,直接把k带入成数字了,导致debug了很久。
print(result)

总结:

        今天的题目还算友好,一方面因为字符串目前在我接触和感受的范围里,相对比较容易学习,另一方面,之前练题做了很多字符串的题目。但是,要在熟练简单做法的基础上,看看有没有之前没有用过或没学会的地方。同时,一些细节的地方还需精进,例如列表和字符串的转换,今天又熟练了一点点。每天进步一点点,加油。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值