您的位置:首页 > Web前端

剑指offer第四题方法总结

2016-05-12 00:15 211 查看
题目:输入一个字符串,要求将这个字符串中所有空格的位置都替换成”%20“.例:输入I love you. 输出I%20love%20you.
分析:空格是一个字符,%20是三个字符,所以替换的时候要向后挪动。
这里有三种方法。
第一种:从前向后遍历字符串,遇到一个空格,则将这个空格之后的字符'\0'开始依次向后挪动两个字符,然后再放入%20,直到遍历完整个字符串。这种方法效率比较低。
第二种:重新创建一个字符数组,将这个字符串拷贝过来,遇到空格就替换成%20. 这种方法虽然效率高,但是空间复杂度却增高了。
第三种:先统计整个字符串中空格的数量。再'\0'开始向后一次挪动2*空格数,遇到一次空格,则空格数减一,并且将%20放入。直到空格数为0. 这种方法时间和空间相对来说都是最理想的。

在这里我们只实现第三种:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

char *replace_blank(char src[])
{
assert(src );
int blank = 0;
char *psrc = src ;
while (*psrc)                       //统计空格个数,同时让psrc指向‘\0'
{
if (*psrc == ' ' )
blank++;
psrc++;
}
while (blank)
{
if (*psrc== ' ' )                               //遇到空格开始替换
{
*(psrc+blank*2)= '0';
*(psrc+blank*2-1)= '2';
*(psrc+(--blank)*2)= '%';
}
else
*(psrc+blank*2)= *psrc;
psrc--;
}
return src ;
}

int main()
{
char src[50] = { 0 };
gets(src);
char *ret = replace_blank(src);
printf( "%s\n", ret);
system( "pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: