剑指offer:替换空格

Posted lj-lj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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;
    }
};

 

以上是关于剑指offer:替换空格的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer字符串面试题 替换空格

剑指offer 2.替换空格

剑指OFFER替换空格

替换空格-剑指Offer

[剑指offer] 替换空格

《剑指Offer》之替换空格