【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--;
}
}
}
};
截图证明:
思考:
优化:可将原数组中的空格位置记下,从而直接进行替换。