您的位置:首页 > 职场人生

剑指offer面试题:替换空格(将字符串每个空格替换为%20)

2016-06-15 21:41 393 查看
题目:请实现一个函数,把字符串的每个空格替换成“%20”。例如:输入:“we are happy.”,则输出:“we%20are%20happy.”

这里考虑的是在原来的字符串上做替换这一种情况:

若我们用直接做法从头到尾扫描字符串,每碰到一个空格就做替换,其空格后面的字符都必须后移两个字节,如图:



浅黄色背景代表需要移动的字符,紫色背景代表需要移动两次的字符,因此,若这样做,有O(n)个空格的话总时间效率为O(n^2),所以我们要寻找一种更快的方法,那就是把从前向后替换改成从后向前替换。

如图过程:



先遍历一次字符串,统计空格数目,然后计算出替换后字符串总长度,然后设两个指针p1,p2, p1指向原字符串末尾,p2指向替换之后字符串末尾,向前移动p1,逐个将其指向的字符复制到p2指向的空间,若遇到空格,p1向前移动1位,在p2之前插入“%20”,在将p2向前移动3位。具体代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void ReplaceBlack(char str[],int lenth)//lenth为字符数组总长度
{
int numblack=0;
char *ptr=str;
int oldlenth=strlen(str);//字符数组原实际长度
int newlenth=0;
if(str==NULL&&lenth<=0)
{
return;
}
while(*ptr)//统计空格数量
{
if(*ptr==' ')
{
numblack++;
}
ptr++;
}
if(numblack==0)
{
return;
}
newlenth=oldlenth+2*numblack;//字符数组替换后新长度
if(newlenth>lenth)
{
return;
}
while(oldlenth<newlenth)
{
if(str[oldlenth]!=' ')//依次复制字符串内容
{
str[newlenth--]=str[oldlenth--];
}
else//空格替换
{
oldlenth--;
str[newlenth--]='0';
str[newlenth--]='2';
str[newlenth--]='%';
}
}
}
int main()
{
char str[30]="we are happy.";
ReplaceBlack(str,30);
printf("%s\n",str);
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: