版权声明:敲一敲看一看 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;
}