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

替换空格

时间:2020-02-29 22:50:34      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:提取   esc   接下来   size   while   number   color   字符   ret   

要求:时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 

题目描述

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
 
编程语言:C++
 
刚开始,想着用c++自带的函数strtok(以空格作为分隔符,提取出多个子字符串),strcat(再将子字符串给拼接起来)两个函数来完成,结果发现这些函数都是不让用的,啊,原谅我这个刷题的小白吧!!接下来,另谋它路吧。
记住:字符串是以‘\0’结尾的,刚开始的时候还一直在纠结,你length= length+2就行了,又没有给分配内存,怎么往里存,熟不知,length是字符串str的长度,但并不代表str的size就这么大。
一种思路是:从前往后,遇到一个空格,就将后面的字符全部后移2个字符,然后再插入“%20”
class Solution {
public:
    void replaceSpace(char *str,int length) {
        if(str == NULL || length < 0)return ;
        for(int i=0;i < length;)
        {
            if(str[i] ==  )
            {
                length = length + 2;
                int j = length -1;
                while(j > i + 2)
                {
                    str[j] = str[j-2];
                    j--;
                }
                str[i] = %;
                str[i+1] = 2;
                str[i+2] = 0;
                i = j+1;
            }
            else
                i++;
        }
    }
};
另一种思路是:先计算空格的个数,从后往前插入,这样每个字符只用移动一次即可,既然是倒着插入,那么插入的字符串也就相应的变成了“02%”
lass Solution {
public:
    void replaceSpace(char *str,int length) {
        if(str == NULL || length < 0)return;
        int i = 0;
        int oldnumber = 0;//记录以前的长度
        int replacenumber = 0;//空格的数目
        while(str[i] != \0)
        {
            oldnumber ++;
            if(str[i] ==  )
            {
                replacenumber ++;
            }
            i++;
        }
        int newlength = oldnumber + 2 * replacenumber;//插入后的长度
        if(newlength > length)//如果计算后的长度大于总长度就无法插入,说明无空格,不需要插入
        {
            return ;
        }
        int pOldlength = oldnumber;//字符串以‘\0‘结尾
        int pNewlength = newlength;
        while(pOldlength >= 0 && pNewlength>pOldlength)
        {
            if(str[pOldlength] ==  )
            {
                str[pNewlength--] = 0;
                str[pNewlength--] = 2;
                str[pNewlength--] = %;
            }
            else
            {
                str[pNewlength--] = str[pOldlength];
            }
            pOldlength--;//不管是if还是else都要把pOldlength前移
        }
    }
};

替换空格

标签:提取   esc   接下来   size   while   number   color   字符   ret   

原文地址:https://www.cnblogs.com/whiteBear/p/12386380.html

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