剑指offer2-替换空格

题目描述

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

思路:该问题我想到了两种思路。

第一种比较简单。

建立一个新的数组,对原字符串从头开始依次检测,若不为空就直接复制到新数组里,若为空,就将%20填入新数组,最后再整个复制到原数组里。

第二种方法。

1 遍历原字符串,找到所有的空格个数count(即一共有count个空格)。那么经过替换最终的数组长度newlength即为原字符串的长度加上count*2.

2 对原字符串从后往前依次遍历,从str[length-1]开始遍历,若是不为空就直接复制到str[newlength-1],若是为空就填入%20,注意,因为是从后往前填充,所以应该先填0,再填2,最后填%。然后接着遍历原字符串。(注意,因为是从后往前填充,所以替换后的字符串是不会影响到原字符串中还没有检测到的那些前面的字符的)。

代码:

class Solution {
public:
    void replaceSpace(char *str,int length) {
        if(str==NULL || length<=0)
        {
            return;
        }
        
        int count=0;
        int newlength;
        for(int i=0;i<length;i++)
        {
            if(str[i]==' ')
            {
                count++;
            }
        }
        newlength = length+count*2;
        
        for(int i=length-1;i>=0;i--)
        {
            if(str[i]!=' ')
            {
                str[newlength-1] = str[i];
                newlength--; 
            }
            else
            {
                str[newlength-1] = '0';
                str[newlength-2] = '2';
                str[newlength-3] = '%';
                newlength -= 3;
            }
                
        }
        
        
        
        
        /*
        //这个方法是构造一个新的数组,若原数组不为空格,就直接复制过去,若为空格,就依次将%20
        //复制过去,最后再复制到原数组,但是有问题所以换一种方式
        if(str==NULL||length==0)
        {
            return;
        }
        char *str1;
        int len = 0;
        for(int i=0;i<length;i++)
        {
            if(str[i]!=' ')
            {
                str1[len] = str[i];
                len++;
            }
            if(str[i]==' ')
            {
                str1[len] = '%';
                str1[len+1] = '2';
                str1[len+2] = '0';
                len = len+3;
            }
        }
        for(int i=0;i<len;i++)
        {
            str[i] = str1[i];
        }
        */

    }
};
原文地址:https://www.cnblogs.com/loyolh/p/12859463.html