剑指offer_t2 替换空格 c++


在这里插入图片描述

1 从前往后遍历

假如从前往后替换,那么遍历时,每出现一个空格,都需要将该空格后面的字符移动3个位置。
假若从后往前替换,在已知空格数的前提下,每个字符只需要移一次。

2 从后往前遍历

用双指针p1和p2,p1指向原字符串末尾,p2指向替换空格后字符串末尾;
每次循环时,将p1指向的内容赋给p2指向的内容;
当p1指向空格时,p2指向内容依次赋值为0,2,%。
直到p1=p2时,说明空格已经替换完了。
可以自己代入特殊情况验证。

#include<iostream>
using namespace std;

void replaceSpace(char *str,int length)
{
    if(str == nullptr||length <=0) return; //用c++11编译
    int space_count = 0;
    for(int i = 0;i < length; i++)
    {
        if(str[i] == ' ')
            space_count++;
    }
    if(!space_count) return;

    int new_length = length + 2*space_count;

    char *p1 = str + length;
    char *p2 = str + new_length;
    while(p1 != p2)
    {
        if(*p1 == ' ')
        {
            *p2-- = '0';
            *p2-- = '2';
            *p2-- = '%';
        }
        else
        {
            *p2-- = *p1;
        }
        p1--;
    }
}
int main()
{
    int i;
    int length = 12;
    char str[length] = {"we are happy"};
    replaceSpace(str, length);
    while(str[i] != '\0')
    {
        cout<<str[i];
        i++;
    }
    return 0;
}

二刷时发现牛客网已经更新,现粘上代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    string replaceSpace(string s) {
        // write code here
        int count=0;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]==' ')
                count++;
        }
        int i= s.size()-1;
        int j=s.size()-1+2*count;
        string s1(s.size()+2*count,'.');
        while(i>=0)
        {
            if(s[i]== ' ')
            {
                s1[j]='0';
                j--;
                s1[j]='2';
                j--;
                s1[j]='%';
                i--;
                j--;
            }
            else
            {
                s1[j] = s[i];
                i--;
                j--;
            }
        }
        return s1;
    }
};

3 妙用STL 算法

利用string 中的replace 函数,找到空格后即替换。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    string replaceSpace(string s) {
        // write code here
        if(s.empty()) return s;
        for(int i=0; i<s.size();i++)
            if(s[i]==' ')
                s.replace(i,1,"%20");
        return s;
    }
};

4 正则表达式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通信仿真爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值