题目:实现一个函数,把字符串中的每个空格替换成“%20”.例如输入"We are happy",则输出“We%20are%20happy”。
对于这道题来说,大多数人都会从前向后遍历字符串,遇到空格时,将后面的字符串后移,这样一来,时间复杂度瞬间到了o(n^2),如果我们首先遍历字符串判断出字符串内由几个空格,然后从后向前遍历,一次放到位。这样一来,时间复杂度瞬间降为o(n).
下面给出代码:
#include<iostream>
#include<string>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define N 100
char* replace_blank(const char* &str)
{
int len = strlen(str);
int cnt = 0;
char *string = (char *)str;
if(str == NULL || len <= 0){
return NULL;
}
while(*string){
if(*string == ' '){
cnt++;
}
string++;
}
int len2 = len + 2 * cnt + 1;
char * string1 = new char[len2];
strcpy(string1,str);
len = len + 1;
while(len >= 0){
if(string1[len] == ' '){
string1[len2--] = '0';
string1[len2--] = '2';
string1[len2--] = '%';
}else{
string1[len2--] = string1[len];
}
len--;
}
return string1;
}
int main(int argc,char**argv)
{
string str;
int i = 0;
const char * str1;
char *str2;
int len;
int k ;
cout << "please input string:"<<endl;
getline(cin,str);
str1 = str.c_str();
cout << str << endl;
len = strlen(str1);
str2 = replace_blank(str1);
for(i = 0;i < strlen(str2);++i){
cout << str2[i];
}
cout << endl;
delete str2;
return 0;
}
其执行结果:
下来我们对内存进行检测,看是否申请空间的都释放了: