【2】数组空格替换

【2】替换空格

  • 时间限制:1秒
  • 空间限制:32768K
  • 本题知识点: 字符串

题目描述

请实现一个函数,将一个字符串中的空格替换成“%20”。
例如,当字符串为We Are Happy.
则经过替换之后的字符串为We%20Are%20Happy。

牛客网题目链接:点击这里

vs2010中测试代码

#include <iostream>
using namespace std;
//无效方案
//void replaceSpace(char *str, int length)
//{
//  int Num_char=0;
//  int Num_space=0;
//
//  char *temp=NULL;
//  char *p=str;
//  char *t=NULL;
//  for(; (*p)!='\0'; p++)
//  {
//      Num_char++;
//      if((*p)==' ')
//          Num_space++;
//  }
//
    //  temp=(char*)malloc(Num_char+Num_space*2);   
    //定义临时字符串大小
//  t=temp+(Num_char+Num_space*2);
//  
//  *t='\0';  //将结束符挪到最后
//  p--; t--;
//
//  while( p>=str ) 
//  {
//      if(*p!=' ') //字符直接复制到最后位置
//      {   
//          *t=*p; 
//          p--; t--;
//      }
//      else       //空格时替换
//      {
//          *t='0'; t--;
//          *t='2'; t--;
//          *t='%'; t--;
//          p--;
//      }
//  }
//  str=temp; //这里仅是让指针指向新建的字符串,
    //  cout<<str<<endl; //而并未改变例程test1中的字符串。
//}
//提示1:数组字符串可以越界,而指针字符串为常量,无法修改和越界。
//提示2:sizeof字符数组,得出的长度包含'\0'结束符。

//改进方案
void replaceSpace(char *str, int length)
{
int Num_char=0; //获取字符串长度,也可用sizeof
int Num_space=0; //获取空格数量

char *p=str;
char *t=NULL;
for(; (*p)!='\0'; p++)
{
    Num_char++;
    if((*p)==' ')
        Num_space++;
}

t=str+Num_char+Num_space*2;
*t=*p;  //将结束符复制过去
t--; p--;
while(t!=p)
{
    if(*p!=' ') //字符直接复制到最后位置
    {   
        *t=*p; 
        p--; t--;
    }
    else       //空格时替换
    {
        *t='0'; t--;
        *t='2'; t--;
        *t='%'; t--;
        p--;
    }
}
}
//字符串结束符为“\0”
int main()
{
char test1[]="hello world"; //经验证测试例程为数组,
//char *test2="hello world"; //并非指针字符串。指针字符串无法改变。
cout<<test1<<endl;

replaceSpace( test1, 10);

cout<<test1<<endl;

}

说明:
- 该代码会输出正确结果,但同时程序会发生中止现象,可能是因为数组发生越界行为。
- 但把代码提交到牛客网上便顺利通过,以下为牛客网提交代码。


//length为牛客系统规定字符串输出的最大长度,固定为一个常数
class Solution {
public:
    void replaceSpace(char *str,int length) {
       //不合理输入
        if(str==NULL || length<0) return;

        unsigned int num=0;
        int i=0;
        for(; i<length && str[i]!='\0'; i++)
        {
            if(str[i]==' ') num++;
        }
        int j=i+2*num;

        //不够分的情况
        if(j>length) return;

        for( ; i>=0; i--)
        {
            if(i==j) break;  //此处不能写成str[i]==str[j]
            if(str[i]==' ')
            {
               str[j]='0'; j--;
               str[j]='2'; j--;
               str[j]='%'; j--;   
            }
            else
            {
                str[j]=str[i]; j--;
            } 
        }
    }
};

截图证明:

这里写图片描述


思考:
优化:可将原数组中的空格位置记下,从而直接进行替换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值