您的位置:首页 > Web前端

剑指offer刷题—替换空格

2016-05-07 14:52 330 查看
一天一题的时间又到了,刚好是周六,让我们今天来好好分析一下下面这一道题:

面试题4:替换空格

请实现一个函数,把字符串中的每个空格替换成为“%20”.例如输入“We are happy”,则输出“We%20are%20happy”

首先对于这一道题,其实在网络编程中,是会用到的,我们常常将例如‘ ’这样的字符转换成其他可以识别的字符。转换规则是在‘%’后面跟上ASCII码的十六位进制的表示。

对于这一道题,我们要进行分析,按照常规的思路,首先你需要寻找空格,你需要把所替换空格后面的内容要全部移动,空出3个位置,把‘%’,‘2’,‘0’这三个字符插入进去。



在这,我们假设字符串的长度是n,对于每个空格字符,需要移动后面O(n)个字符,所以对于含有O(n)个空格字符的字符串而言总的时间的效率是O(n^2);

接下来,我们提供一种方式,作为效率更高的方法:

首先我们可以遍历一遍字符串,得到‘ ’的个数,并且得到字符串被替换以后的总长度。总长度实际上就是 原长度+空格数*2。然后,我们定义两个指针,一个指向原字符串末尾,另一个指向变化以后的字符串末尾。我们的字符串从替换后的长度位置开始,两个指针向前进行移动,当遇到 ‘ ’时,我们就依次把‘0’,‘2’‘%’放入就可以了,然后继续向前,继续替换前面的空格,直到我们把所有空格替换完毕,这时,我们就可以发现,没有空格以后,这两个指针会同时执行同一个位置了,所以这时,我们就可以结束了,所有的替换也就完成了。

通过上述说明,我们也就可以知道,所有的字符在这,也只移动了一次,所以时间复杂度为O(n),



#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Replace(char arr[])
{
int len = strlen(arr);
int count = 0;

char *p = arr;
int old_end = len;
int new_end = 0;
while (*p)
{
if (*p == ' ')
{
count++;
}
p++;
}
new_end = len + 2 * count;

while (old_end < new_end)
{
if (arr[old_end] == ' ')
{
old_end--;
arr[new_end--] = '0';
arr[new_end--] = '2';
arr[new_end--] = '%';
}
else
{
arr[new_end--] = arr[old_end--];
}
}
}
int main()
{
char str[20] = "we are happy";
Replace(str);
printf("%s\n", str);
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: