07. 字符串理论基础,344.反转字符串,541.反转字符串II,卡码网:54.替换数字

class Solution { //双指针解法(不使用额外空间,反转)-->双指针
public:
    void reverseString(vector<char>& s) {
        int left = 0, right = s.size() -1;

        while(left < right){
            swap(s[left], s[right]);
            left++; right--;
        }
    }
};

class Solution {
public:
    string reverseStr(string s, int k) {
        int s_size = s.size();
        int left, right;

        for(int i = 0; i < s.size(); i += 2*k){
            if(s_size - i >= k) {left = i; right = i + k - 1;} //注意区间,左闭右闭
            else {left = i; right = s_size - 1;}

            while(left < right){ //双指针
                swap(s[left], s[right]);
                left++; right--;
            }
        }
        return s;
    }
};

很多数组填充类的问题,做法都是先预先给数组扩容到填充后的大小,然后在从后向前进行操作,这么做有两个好处:(1)不用申请新数组;(2)从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。

# include<iostream>

using namespace std;

int main() {

    string s; cin >> s;
    int s_size = s.size(), s_resize = 0;
    for (char c : s) { //计算需要扩容的大小
        if (c - '0' < 10) s_resize += 6;
        else s_resize += 1;
    }
    s.resize(s_resize); //扩容

    int left = s_size - 1, right = s_resize - 1;
    while (left >= 0) {
        if (s[left] - '0' < 10) {
            //注意!!! string("rebmun"),不能写为char c : "rebmun"
            for (char c : string("rebmun")){
                s[right] = c; right--;
            }
            left--;
        }
        else { s[right] = s[left]; left--; right--; }
    }
    cout << s << endl;
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值