算法训练Day07 | 344.反转字符串、541. 反转字符串II、54.替换数字、151.翻转字符串里的单词、55.右旋转字符串

文章介绍了LeetCode中涉及的几种字符串操作,如反转字符串(使用头尾指针)、字符串替换数字、翻转单词顺序以及右旋转字符串,展示了基础的编程技巧和算法应用。
摘要由CSDN通过智能技术生成

344.反转字符串

题目链接:344.反转字符串-力扣(LeetCode)

思路:easy,最简单的直接调用函数解决,自己实现反转也很简单,设置头尾指针依次反战就行

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

    }
};

参考文章:代码随想录-344.反转字符串

541. 反转字符串II

题目链接:541. 反转字符串II-力扣(LeetCode)

思路:easy, 同样的思路, 找到反转的头尾,依次反转即可

class Solution {
public:
    string reverseStr(string s, int k) {
        int l = 0;
        int r = k-1;
        while(l<s.size()){
            if(r > s.size()-1){
                r = s.size()-1;
            }
            int left = l;
            int right = r;
            while(left<right){
                swap(s[left], s[right]);
                left++;
                right--;
            }
            l += (2*k);
            r += (2*k);
        }
        return s;

    }
};

参考文章:代码随想录-541. 反转字符串II

54.替换数字

题目链接:54.替换数字-卡码网

思路:easy,转换为数组替换或者开一个新的字符串替换都可

#include <iostream>
#include <string>
using namespace std;

int main(){
    string s;
    cin>>s;
    string out = "";
    for(int i = 0; i< s.size(); i++){
        if(s[i]>='0' && s[i]<='9'){
            out += "number";
        }
        else{
            out += s[i];
        }
    }
    cout<<out;
}

参考文章:代码随想录-54.替换数字

151.翻转字符串里的单词

题目链接:151.翻转字符串里的单词-力扣(LeetCode)

思路:前面题目的综合,流程复杂一些,重点依然是找好头尾指针

class Solution {
public:
    string reverseWords(string s) {
        reverse(s.begin(), s.end());
        int n = s.size();
        int idx = 0;
        for(int l = 0; l<n; l++){
            if(s[l] != ' '){
                if(idx != 0){
                    s[idx++] = ' ';
                }
                int r = l;
                while(r<n && s[r] != ' '){
                    s[idx++] = s[r++];
                }
                reverse(s.begin()+idx-(r-l), s.begin()+idx);
                l = r;
            }
        }
        s.erase(s.begin()+idx, s.end());
        return s;

    }
};

参考文章:代码随想录-151.翻转字符串里的单词

55.右旋转字符串

题目链接:55.右旋转字符串-卡码网

思路:拆分成两个字符串再合并, 如果空间复杂度为O(1)则参考代码随想录方法

#include <iostream>
#include <string>
using namespace std;

int main(){
    int k;
    cin>>k;
    string s;
    cin>>s;
    string out1 ="";
    string out2 ="";
    for(int i=0; i<s.size(); i++){
        if(i<s.size()-k){
            out1+=s[i];
        }
        else{
            out2 += s[i];
        }
    }
    string out = out2+out1;
    cout<<out;
}

参考文章:代码随想录-右旋转字符串

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值