剑指offer刷题—替换空格

一天一题的时间又到了,刚好是周六,让我们今天来好好分析一下下面这一道题:
面试题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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值