码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer:替换空格

时间:2019-03-23 00:32:00      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:int   solution   替换空格   color   出现   class   pac   遇到   开始   

题目描述:

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

 

思路:

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

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

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

注意点:

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

空指针判断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]!=\0)
        {
            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:替换空格

标签:int   solution   替换空格   color   出现   class   pac   遇到   开始   

原文地址:https://www.cnblogs.com/LJ-LJ/p/10581929.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!