541. 反转字符串 II - 力扣(LeetCode)

class Solution {
public:
    string reverseStr(string s, int k) {
        int n = size(s);
         for(int i=0;i<n;i+=2*k)
            {
                int left=i;
                int right=min(i+k-1,n-1);
                while(left<=right)
                {
                    swap(s[left],s[right]);
                    left++;
                    right--;
                }
            }
            return s;
    }
};

思路:

题目理解:对一个字符串,前k个反转,后k个不反转,依此类推 ......

1.设一个循环,实现间隔2k进行操作;

2.循环中实现前k个反转;

问题:

1.右边界的定义为什么是min(i+k-1,n-1)

i+k-1   类比left =0,right=k-1;left = i,right = i+k-1;

当s=abc

i=0  ,i=2时,left = 2,right =2+2-1=3,s[2] = 'c';s[3]不存在:超出数组边界索引

预期输出是bac

n-1   =3-1=2;是不变的。

怎么想到这一点?-----为了不超出边界索引,故而n-1

第三题:

题目描述:将给定字符串中的数字替换为number

#include<iostream>
#include<cstring>
using namespace std;
int main(){
    string s;
    cin>>s;
    int count = 0;
    int len = s.length();
    for(int i=0;i<len;i++){
        if(s[i]>='0' && s[i]<='9')
        count++;
    }
    int Oldsize= len;
    int Newsize= len+6*count;
    int j;
    j=Newsize-1;
    s.resize(Newsize);
    //s[Newsize]='\0'; // Null-terminate the new string  为啥这句不加会错
    for(int i=Oldsize;i>=0;i--){
      
    {
        if (s[i]>='0' && s[i]<='9'){
        s[j--]='r';
        s[j--]='e';
        s[j--]='b';
        s[j--]='m';
        s[j--]='u';
        s[j--]='n';
        }
        else{
            s[j--]=s[i];
        }
        

    }
}
    std::cout<<s<<endl;
    return 0;
}
// 思路:
// 1.首先扩容(for循环统计数字个数,确定新的数组长度)
// 2.从后往前开始遍历,遇到数字开始替换;
// 问题:
// 1.(基本)printf("%s",s)//这里不需要取地址,因为数组名本身就是地址;
// 2.换成string后,要先扩展字符串的大小;
// 3.s[Newsize]='\0';C风格balaa;nce需要字符串以

 

posted on 2025-11-12 14:22  FAfa_C++  阅读(8)  评论(0)    收藏  举报