[面试] 算法(五)—— 替换字符串中的空格

char str[100] = " hello world ";

我写上述代码的含义是,我们是在已分配足够空间的字符串的基础上开始空格的替换的,也即不存在索引越界、再分配内存的问题。

替换的顺序有二:

  • (1)从左到右

    每发现一个空格,后面所有的元素退两格,也即从左到右无法一步实现将后面的单词出现在该出现的位置。

  • (2)从右到左

    每发现一个空格,最后的一个单词退到合适的问题,可以一步实现最右的单词出现在该出现的位置。

显然出于效率的考虑,从右向左替换是更为合理的。

void ReplaceBlank(char str[], int len)          // len 仅仅用来标识合法区间
{
        if (str == NULL || len <= 0)                    
            return ;

        int originLen = 0;
        int numOfBlank = 0;

        while (str[originLen] != '\0')
        {
            if (str[originLen] == ' ')
                ++numOfBlank;
            ++originLen;
        }

        int newLen = originLen + numOfBlank * 2;
        int p1 = originLen, p2 = newLen;

        while (p1 >= 0 && p2 > p1)
        {
            if (str[p1] == ' ')
            {
                str[p2--] = '0';
                str[p2--] = '2';
                str[p2--] = '%';
            }
            else
            {
                str[p2--] = str[p1];
            }
            --p1;
        }
}
    原文作者:Inside_Zhang
    原文地址: https://blog.csdn.net/lanchunhui/article/details/50989155
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞