Day08| 344.反转字符串、541.反转字符串II、54.替换数字

2025-07-16

344.反转字符串

题目链接:344.反转字符串
文档讲解:代码随想录
状态:简单AC

思路

简单的双指针交换问题

了解swap函数的用法交换s[i]s[j]的使用方式为:swap(s[i],s[j])

题解

class Solution {
public:
    void reverseString(vector<char>& s) {
        int left = 0, right = s.size()-1;
        while(left<right)
        {
            char temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            left++;
            right--;
        }
    }
};

541.反转字符串II

题目链接:541.反转字符串II
文档讲解:代码随想录
状态:改了一遍轻松AC

思路

典型的模拟题型,没有什么难度

弄清楚区间边界,对于复用代码封装好函数

题解

class Solution {
void reverse(string &s,int start,int end)
{
    for(int left = start, right = end;left<right;left++,right--)
    {
        char temp = s[left];
        s[left] = s[right];
        s[right] = temp;
    }
}
public:
    string reverseStr(string s, int k) {
        int i = 0;
        while(true)
        {
            if(i+2*k>s.size())break;
            reverse(s,i,i+k-1);
            i+=2*k;
        }
        if(s.size()-i<k)reverse(s,i,s.size()-1);
        else reverse(s,i,i+k-1);
        return s;
    }
};

54.替换数字

题目链接:54.替换数字
文档讲解:代码随想录
状态:非最优方法轻松AC

思路

简单方法不说了

双指针法:最开始想从前往后,像27题,数组复用的思想,但是本题明显number五个字母会覆盖有用的值

学习了容器扩大(学习了resize方法)后的从后往前双指针法(数组复用法),并得到重要结论,后一个指针一定不会追上前一个指针(不会产生覆盖)

题解

#include <iostream>
#include <string>
using namespace std;
int main()
{
    // string s("");
    // string result("");
    // cin>>s;
    // for(int i = 0;i<s.size();i++)
    // {
    //     if(s[i]<='9' && s[i]>='0')result += "number";
    //     else result += s[i];
    // }
    // cout<<result<<endl;
    string s("");
    string result("");
    cin>>s;
    int count = 0;
    for(auto i:s)if(i<='9'&& i>='0')count++;
    s.resize(s.size()+5*count);
    int i = s.size()-5*count-1, j = s.size()-1;
    for(;i>=0;i--,j--)
    {
        if(s[i]<='9'&& s[i]>='0')
        {
            s[j--] = 'r';
            s[j--] = 'e';
            s[j--] = 'b';
            s[j--] = 'm';
            s[j--] = 'u';
            s[j] = 'n';
        }
        else s[j] = s[i];
    }
    cout<<s<<endl;

    return 0;
}