題目:實現一個函數,把字符串中的每個空格替換成“%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;
}
其執行結果:
下來我們對內存進行檢測,看是否申請空間的都釋放了: