代码随想录算法训练营第九天|344.反转字符串, 541. 反转字符串II,卡码网:54.替换数字

344.反转字符串

反转字符串比较简单,除了用reverse,可以用for循环,两头向中间夹,进行swap

class Solution {
public:
    void reverseString(vector<char>& s) {
        int half=s.size()/2;
        int length=s.size();
        for(int i=0,j=length-1;i<half;i++,j--){
            swap(s[i],s[j]);
        }
    }
};

541. 反转字符串II

文章链接:https://programmercarl.com/0541.反转字符串II.html#思路
题目链接:https://i.cnblogs.com/posts/edit
视频链接:https://www.bilibili.com/video/BV1dT411j7NN

思路:其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
总结:一开始这里我写的很麻烦,统计前2k的个数,还统计2nk之后的个数,然后每一种情况分别进行了代码逻辑的书写

class Solution {
public:
    //子串翻转
    void reverse(int start,int end,string &s){
        for(int i=start,j=end;i<j;i++,j--){
            swap(s[i],s[j]);
        }
    }
    string reverseStr(string s, int k) {
        int len=s.size();
        int rem=len%(2*k);//若为0:恰好  0~k:翻转   k~2k:翻转前k个
        int count=len/(2*k);
        int start=0,curE=0;
        if(count==0&&rem==0) return "";
        if(count==0&&rem>0){
            if(rem<=k) curE=rem-1;
            else curE=k-1;
            reverse(start,curE,s);
        }
        if(count>0){
            curE=k-1;
            for(int i=0;i<count;i++){
                reverse(start,curE,s);
                start+=2*k;
                curE+=2*k;
            }
            if(rem>0){
                if(rem<=k) curE=len-1;
                reverse(start,curE,s);
            }
        }
        return s;
    }
};

改进后:

class Solution {
public:
    string reverseStr(string s, int k) {
        int n=s.size();
        for(int i=0;i<n;i+=2*k){
            int j=min(i+k,n);// 计算需要反转的区间结束位置
            reverse(s.begin()+i,s.begin()+j);
        }
        return s;
    }
};

卡码网:54.替换数字

文章链接:https://programmercarl.com/kama54.替换数字.html
题目链接:https://kamacoder.com/problempage.php?pid=1064

#include <iostream>
using namespace std;

int main(){
    string s;
    while(cin>>s){
        int oldInd=s.size()-1;
        int count=0;
        int n=s.size();
        for(int i=0;i<n;i++){
            if(s[i]>='0'&&s[i]<='9'){ //字符可以这样比较大小,它们被分配了ASCII码
                count++;
            }
        }
        s.resize(s.size()+count*5);
        int newInd=s.size()-1;
        for(;oldInd>=0;oldInd--){
            if(s[oldInd]>='0'&&s[oldInd]<='9'){
                s[newInd--]='r';
                s[newInd--]='e';
                s[newInd--]='b';
                s[newInd--]='m';
                s[newInd--]='u';
                s[newInd--]='n';
            }
            else{
                s[newInd--]=s[oldInd];
            }
        }
        cout << s << endl;
    }
}
posted @   W-Vicky11  阅读(196)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示