剑指Offer算法实现之四:替换空格

题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are Happy”,则输出“We%20are%20Happy”。

思路:一个空格的替换需要两个额外的字符空间。这是一种需要扩展空间的“替换”。
① 若不可修改源字符串,即“复制式”的替换,则可先申请足够的额外空间,再从前往后拷贝源字符串,拷贝过程中作替换。
② 若可修改源字符串,并确保源字符串尾部后有足够的空间以供替换产生的空间扩展,则要从后往前替换,这样“移动”可一次到位,不必多次重复“移动”

编译环境:ArchLinux+Clang3.3

实现:针对思路②中的情况,C语言代码如下:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/** len 为总空间长度 **/
void replace_blank(char *str, int len)
{
    int old_len = 0;
    int blanks_cnt = 0;
    char *ptr = str;

    while(*ptr) {
         old_len++;
         if (*ptr == ' ')
             blanks_cnt++;
         ptr++;
    }
    int new_len = old_len + 2 * blanks_cnt;
    if (blanks_cnt == 0 || new_len > len - 1)
        return;
    str[len] = '\0';
    char *ptr1 = str + old_len;
    char *ptr2 = str + new_len;
    *ptr2++ = *ptr1++;
    while (str < ptr1){
        if (*ptr1 == ' '){
            *ptr2-- = '0';
            *ptr2-- = '2';
            *ptr2-- = '%';
        }else{
            *ptr2-- = *ptr1;
        }
        ptr1--;
    }
}

int main()
{
    char str[100]; //足够空间,尽管过剩
    strncpy(str, "hello world,  this is a demo!", sizeof(str));
    printf("%s\n", str);
    replace_blank(str, sizeof(str));
    printf("%s\n", str);
}

你可能感兴趣的:(剑指Offer算法实现之四:替换空格)