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

版权声明:敲一敲看一看 https://blog.csdn.net/idealhunting/article/details/84974316

题目描述:

请实现一个函数,将一个字符串中的每个空格替换成“%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 <iostream>
#include<cstring>
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;i<length;i++){
                if((str[i])!=' ')str_ans[len++]=str[i];
                else {
                    str_ans[len++]='%';
                    str_ans[len++]='2';
                    str_ans[len++]='0';
                }
            }
            str_ans[len]='\0';
            //for(int i=0;i<len-1;i++){
               // printf("%c",str_ans[i]);
            //}
             strcpy(str,str_ans);
            free(str_ans);
	}
};

class Solution2{//剑指offer
public:
    void replaceSpace(char *str,int length){//length为字符数组的总容量
        if(str==nullptr||length<=0)return;
        //originalLength为字符串str的实际长度
        int originalLength=0;
        int numberOfBlank=0;
        int i=0;
        while(str[i]!='\0'){
            ++originalLength;
            if(str[i]==' ')++numberOfBlank;
            ++i;
        }
        //newLength为吧空格替换成‘%20’之后的长度
        int newLength=originalLength+numberOfBlank*2;
        if(newLength>length)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;
}

猜你喜欢

转载自blog.csdn.net/idealhunting/article/details/84974316