剑指offer面试题五:替换空格

题目描述:

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

题目源于网络编程中url参数中含有特殊字符的处理,有直接接口可以调用的,这里考察字符串处理知识;

思路一:如果可以申请新的内存空间,那么直接遍历即可时间复杂度为O(n),空间复杂度为O(n);(考察点不是这,这开辟了新的内存,past)

思路二:每个遍历后遇到空格将后面内容往后挪,添加所要替换的内容,时间复杂度为O(n^2);(past)

思路三:从后往前替换(用到two pointer 思想)减少字符串的挪动次数。时间复杂度为O(n)。(offer)

思路四:直接调用相关接口(past)

考点:1.字符串编程能力,2.时间效率分析能力3.内存覆盖的警觉(这无论何时自己都得保持警惕)4.逻辑思维(否定从前往后的等方案后,找到最优方案)

#include 
#include
using namespace std;
class Solution1 {//首先想到的版本....
public:
	void replaceSpace(char *str,int length) {
	    /*int i=0;
	    while(str[i]!='\0'){
            ++i;
        }*/
           char *str_ans=(char*)malloc(sizeof(char)*2*length);//这里前面可以加个实际字符串长度统计,牛客没说明length值
        int len=0;
            for(int i=0;ilength)return;
        int indexOfOriginal=originalLength;
        int indexOfNew=newLength;
        while(indexOfOriginal>=0&&indexOfNew>indexOfOriginal){//这里实际上应该直接判断>=0即可
            if(str[indexOfOriginal]==' '){
                str[indexOfNew--]='0';
                str[indexOfNew--]='2';
                str[indexOfNew--]='%';
            }
            else{
                str[indexOfNew--]=str[indexOfOriginal];
            }
            --indexOfOriginal;
        }

    }
};

class Solution3{
public:
    void replaceSpace(char *str,int length){
        if(str==nullptr||length<=0)return;
        int i=0;
        int originaleLength=0;
        int numberofBlank=0;
        while(str[i]!='\0'){
            if(str[i]==' ')++numberofBlank;
            ++i;
        }
        originaleLength=i;
        int newLength=originaleLength+numberofBlank*2;
        int indexOfOriginal=originaleLength;
        int indexOfNew=newLength;
        while(indexOfOriginal>=0&&indexOfNew>=0){
            if(str[indexOfOriginal]!=' '){
                str[indexOfNew--]=str[indexOfOriginal--];
            }
            else{
                str[indexOfNew--]='0';
                str[indexOfNew--]='2';
                str[indexOfNew--]='%';
                indexOfOriginal--;
            }

        }
    }
};

class Solution5 {//string运用
public:
    void replaceSpace(char *str,int length) {
        string s(str);
        int i=0;
        while((i=s.find(' ',i))>-1){
            s.erase(i,1);
            s.insert(i,"%20");

        }
        auto ret=s.c_str();
        strcpy(str,ret);
    }
};


int main()
{   char a[100]={"We Are Happy."};
    Solution2 s2;
    s2.replaceSpace(a,100);
    int k=0;
    while(a[k]!='\0'){
        printf("%c",a[k]);
        k++;
    }
    return 0;
}

 

你可能感兴趣的:(剑指offer)