问题:

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

思路:

分析:首先分析这个函数,返回值为void,这意味着不能新建一个string类型的变量,最后返回该变量,而是在原来的字符串上做替换,第一个参数为char *str,为一个指针,指向字符串的第一个元素,意味着不能调用字符串函数,因为没有可以调用的对象
解题:首先计算出原始字符串的长度originallength,计算出原始字符串中空格的个数banknumber,根据这两个数据可以算出新串的长度,长度为原始长度加两倍空格长度newlength=originallength+banknumber*2;
从后往前替换,之后从尾向头遍历原始字符串,将数据搬移到尾元素在newlength位置的地方,从尾向头排列,若出现空格,则依次插入‘0’、‘2’、‘%’,直到遍历结束。
!!!注意:字符串是以’\0’为结束标志,一定要在newlength的位置插入’\0’,即str[newlength]=’\0’;

方法一:

class Solution {
public:
    void replaceSpace(char *str,int length) 
    {
        if(str==NULL)
            return;
        int originallength=0;
        int banknumber=0;
        for(int i=0;str[i]!='\0';i++) 
        {
            originallength++;
            if(str[i]==' ')
                banknumber++;
        }

        int newlength=originallength+banknumber*2;
        int pos=newlength-1;
        str[newlength]='\0';                //设置字符串结束符
        for(int i=originallength-1;i>=0;i--)
        {
            if(str[i]==' ')
            {
                str[pos--]='0';
                str[pos--]='2';
                str[pos--]='%';
            }
            else
                str[pos--]=str[i];
        }

    }
};

方法二

把字符串末尾的结束符’\0’当做普通字符处理,从后向前遍历,依次向后移动

class Solution {
public:
    void replaceSpace(char *str,int length) 
    {
        if(str==NULL)
            return;
        int originallength=0;
        int banknumber=0;
        for(int i=0;str[i]!='\0';i++) 
        {
            originallength++;
            if(str[i]==' ')
                banknumber++;
        }
        int newlength=originallength+banknumber*2;
        for(int i=originallength;i>=0;i--)
        {
            if(str[i]==' ')
            {
                str[newlength--]='0';
                str[newlength--]='2';
                str[newlength--]='%';
            }
            else
                str[newlength--]=str[i];
        }

    }
};

方法三:

从前向后遍历,每发现一个空格,就将空格后面的字符依次向后挪动两位(包括字符串末尾的结束标识符’\0’),所以挪动的开始位下表为length

class Solution {
public:
    void replaceSpace(char *str,int length) 
    {
        if(str==NULL)
            return;
        for(int i=0;i<=length;i++)
        {
            if(str[i]==' ')
            {
                for(int j=length;j>i;j--)
                    str[j+2]=str[j];
                str[i]='%';
                str[i+1]='2';
                str[i+2]='0';
                length=length+2;
            }
        }

    }
};

算法复杂度分析:

从后向前遍历,只有单循环,算法复杂度为O(n);
从前向后遍历,在遍历循环的内部,如果发现了空格,需要将空格后面的字符依次移动两位,算法复杂度为O(n*n);