剑指offer-替换空格

题目
请实现一个函数,把字符串中的每个空格替换成“20%”。

思路
从后往前替换,这样可以减少移动次数。
在合并两个数组(包括字符串)时,如果从前往后复制每个数字,则会重复移动某些数字多次,那么就可以考虑从后往前复制。
代码

#include<iostream>
using namespace std;
void ReplaceBlank(char str[])
{

    int before_length=0;
    int after_length=0;
    int numberOfBlank=0;
    int i=0;
    while(str[i]!='\0')
    {
       if(str[i]==' ')
        numberOfBlank++;
       before_length++;
       i++;
    }
    after_length=before_length+2*numberOfBlank;
    int p1=before_length;
    int p2=after_length;
    while(p1>=0&&p2>p1)
    {
        if(str[p1]==' ')
        {
            str[p2--]='%';
            str[p2--]='0';
            str[p2--]='2';
            p1--;
        }
        else str[p2--]=str[p1--];
    }

}
int main()
{
   char str[]="a b c d";
   ReplaceBlank(str);
   cout<<str;
}

补充知识:
1.关于函数的形参与实参,对于数组而言,传数组名就相当于传了指针了。

#include<iostream>
using namespace std;
void change(char str[])
{
    str[2]='a';
}
int main()
{
   char str[]="abcd";
   change(str);
   cout<<str;
}

以上代码的输出是abad。

2.用char*表示字符串时,字符串是常量,不能对其进行修改,只能用于传值。

#include<iostream>
using namespace std;
void change(char *str)
{
    str[2]='a';
}
int main()
{
   char *str="abcd";
   change(str);
   cout<<str;
}

以上代码将无法运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值