剑指offer:替换空格

题目描述:

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

思路:

一开始没理解,函数中给的参数length指的字符串长度,原来表示的是这个字符串的最大长度。参考了网上的题解,说明一下思路。

最原始的想法自然就是从头遍历字符串,遇到空格,就将空格后的字符向后移动,再插入“%20”,但是这样的复杂度为O(n^2),考虑到其实每次替换的过程中后面的字符重复做后移操作。所以考虑从后往前遍历,记录出现的空格总数,再求新字符串的总长度。

使用两个指针,做替换操作,第一个指针指向原始字符串的末尾,第二个指针指向新字符串末尾,从后往前遍历原始字符串,若当前字符为空格,则用第二个指针在新字符串中从后往前的插入“%20”,否则将第一个指针所指向的元素复制到第二个指针的位置。

注意点:

对字符串的处理都应该考虑最后的空字符’’。

空指针判断nullptr。

一般像这种需要向后扩充容量重新整理内存的,最好能够考虑到从尾部开始整理的方法。

代码:

class Solution {
public:
    void replaceSpace(char *str,int length) {
        if(str==nullptr || length==0)
            return;
        int len_str=0;
        int blank=0;
        int i=0;
        while(str[i]!='')
        {
            len_str++;
            if(str[i]==' ')
                blank++;
            i++;
        }
        int new_len = len_str + 2*blank;
        if(new_len>length)
            return;
        while(len_str>=0 && new_len>len_str)
        {
            if(str[len_str]==' ')
            {
                str[new_len--] = '0';
                str[new_len--] = '2';
                str[new_len--] = '%';
            }
            else
            {
                str[new_len--] = str[len_str];
            }
            len_str--;
        }
        return;
    }
};
原文地址:https://www.cnblogs.com/LJ-LJ/p/10581929.html