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

本文介绍了在代码随想录算法训练营Day08中涉及的多种字符串操作,如反转字符串、反转字符串II、替换数字、翻转字符串里的单词和右旋转字符串,主要讲解了双指针法、栈以及相关实现方法和技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



344.反转字符串

题目链接

一、双指针法

1.for循环

class Solution(object):
    def reverseString(self, s):
        """
        :type s: List[str]
        :rtype: None Do not return anything, modify s in-place instead.
        """
        #双指针法
        left = 0
        right = len(s)-1
        for i in range(len(s)//2):
            s[left],s[right] = s[right],s[left]
            left +=1
            right -=1
        return s

2.while循环

class Solution(object):
    def reverseString(self, s):
        """
        :type s: List[str]
        :rtype: 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(object):
    def reverseString(self, s):
        """
        :type s: List[str]
        :rtype: None Do not return anything, modify s in-place instead.
        """
        # 栈
        stack = []
        for i in s:
            stack.append(i)
        for i in range(len(s)):
            s[i] = stack.pop()
        return s

三、本题总结

so easy!


541. 反转字符串II

题目链接

一、双指针法

class Solution(object):
    def reverseStr(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: str
        """
        def reversek(string):
            left = 0
            right = len(string)-1
            while(left<right):
                string[left],string[right] = string[right],string[left]
                left += 1
                right -=1
            return string
        string = list(s)
        for i in range(0,len(string),2*k):          
            string[i:i+k] = reversek(string[i:i+k])
        return ''.join(string)
  1. 使用range(start, end, step)来确定需要调换的初始位置
  2. 对于字符串s = ‘abc’,如果使用s[0:999] ===> ‘abc’。字符串末尾如果超过最大长度,则会返回至字符串最后一个值,这个特性可以避免一些边界条件的处理。
  3. 用切片整体替换,而不是一个个替换.

二、直接使用切片逆转操作

class Solution(object):
    def reverseStr(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: str
        """
        # 创建一个空字符串用于存放最终结果
        result = ""
        # 遍历字符串,步长为2k
        for i in range(0, len(s), 2*k):
            # 取出当前2k区间内的前k个字符进行逆转,后k个字符保持不变
            # 使用切片逆转前k个字符,切片操作会生成一个新的字符串
            part1 = s[i:i+k][::-1]
            part2 = s[i+k:i+2*k]
            # 将处理后的子字符串加到结果字符串中
            result += part1 + part2
        return result

这个直接使用字符串的[::-1]操作

三、本题总结

本题注意指针的移动间隔为2*k会简便许多


卡码网:54.替换数字

题目链接

一、存入数组后替换

class Solution():
    def replace(self,s):
        x = []
        for i in range(len(s)):
            x.append(s[i])
        for i in range(len(x)):
            if x[i].isdigit():
                x[i] = 'number'
        return ''.join(x)
sol = Solution()
s = input()
result = sol.replace(s)
print(result)

二、c++写法 双指针

需扩展空间

#include<iostream>
using namespace std;
int main() {
    string s;
    while (cin >> s) {
        int count = 0; // 统计数字的个数
        int sOldSize = s.size();
        for (int i = 0; i < s.size(); i++) {
            if (s[i] >= '0' && s[i] <= '9') {
                count++;
            }
        }
        // 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小
        s.resize(s.size() + count * 5);
        int sNewSize = s.size();
        // 从后先前将空格替换为"number"
        for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {
            if (s[j] > '9' || s[j] < '0') {
                s[i] = s[j];
            } else {
                s[i] = 'r';
                s[i - 1] = 'e';
                s[i - 2] = 'b';
                s[i - 3] = 'm';
                s[i - 4] = 'u';
                s[i - 5] = 'n';
                i -= 5;
            }
        }
        cout << s << endl;
    }
}

代码随想录

三、本题总结

python解法很简单,但是要注意acm模式的写法


151.翻转字符串里的单词

题目链接

一、分割为数组再双指针翻转

class Solution(object):
    def reverseWords(self, s):
        """
        :type s: str
        :rtype: str
        """
        words =s.split()
        left =0
        right =len(words)-1
        while(left<right):
            words[left],words[right] = words[right],words[left]
            left +=1
            right -=1
        return ' '.join(words) #注意这里有个空格

二、简洁版

class Solution(object):
    def reverseWords(self, s):
        """
        :type s: str
        :rtype: str
        """
        return ' '.join(s.strip().split()[::-1])

三、本题总结

注意join的操作


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

题目链接

一、切片


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值