【2】数组空格替换

来源:互联网 发布:冒险岛2属性数据 编辑:程序博客网 时间:2024/05/17 02:23

【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; //获取字符串长度,也可用sizeofint 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--;            }         }    }};

截图证明:

这里写图片描述


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

1 0
原创粉丝点击