剑指offer——字符串替换空格

题目描述:实现一个函数,把字符串中的每个空格替换成“%20”,例如,输入“we are happy”,输出”we%20are%20happy.”

见到这个题目,我们很容易想到:

//申请一块新空间,存储变化后的字符串,显然不是我们想要的结果
char* Replace(char* array)
{
    char temp[100] = {0};
    int i = 0;

    for(int idx=0; array[idx]!='\0'; ++idx)
    {

        if(array[idx] == ' ')
        {
            temp[i++] = '%';
            temp[i++] = '2';
            temp[i++] = '0';
        }
        else
        {
            temp[i] = array[idx];
            i++;
        }
    }
    temp[i] = '\0';
    return temp;
}

这里写图片描述

由此,我们可以想到如下方法:
(1)先遍历一次字符串,统计出字符串中空格的总数,并可以由此计算出替换之后字符串总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。(2)然后从后往前开始复制替换。首先准备两个指针,p1和p2,p1指向原始字符串的末尾,p2指向那个替换后字符串的末尾,接下来向前移动指针p1,逐个复制它指向的字符到p2所指的位置,遇到空格的话,p1向前移动一个,p2插入“%20”,p2向前移动三个。(3)遇到下一个空格,重复上述过程,等到p1与p2指向同一位置时,表明替换完成。

代码实现如下:

#include<iostream>
using namespace std;

void ReplaceBlank(char string[], int length)
{
    if(string == NULL && length <= 0)
    {
        return;
    }

    int originLength = 0; //字符串实际长度
    int numberofBlank = 0;
    int index = 0;

    while(string[index])
    {
        ++originLength;

        if(string[index] == ' ')
        {
            ++numberofBlank;
        }

        ++index;
    }

    int newLength = originLength + numberofBlank*2; //替换后字符串长度

    if(newLength > length)
    {
        return;
    }

    int indexofOrigin = originLength;
    int indexofNew = newLength;

    while(indexofOrigin >= 0 && indexofNew > indexofOrigin)
    {
        if(string[indexofOrigin] == ' ')
        {
            string[indexofNew--] = '0';
            string[indexofNew--] = '2';
            string[indexofNew--] = '%';
        }

        else
        {
            string[indexofNew--] = string[indexofOrigin];
        }

        --indexofOrigin;
    }
}

void FunTest()
{
    char array[100] = "we are happy";
    ReplaceBlank(array, 20);

    for(int idx=0; array[idx]!='\0'; idx++)
    {
        cout<<array[idx];
    }
    cout<<endl;
}

int main()
{
    FunTest();
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值