题目:把字符串中的空格替换成%20,例如 “we are happy”替换成“we%20are%20happy”;
思路分析:如果从头遍历,遇到空格就替换,则后面整个串都要移动,这样下来,时间复杂度就会很大,那么,为何不考虑从后往前替换呢。
#include<stdio.h>
#include<malloc.h>
//把空格替换成%20
//两种方法:1、创建一个新的数组
//2、在原有数组上进行更改
char* ReplaceBlank1(char *string)
{
if(string == NULL)
{
return NULL;
}
int length = 0;
int black = 0;
int i = 0;
while(string[i] != '\0')
{
length++;
if(string[i] == ' ')
{
black++;
}
i++;
}
char *tmp = (char *)malloc(sizeof(char)*(length+black*2)+1);
i = 0;
int j = 0;
for(;i<=length;i++)
{
if(string[i] == ' ')
{
tmp[j] = '%';
tmp[++j] = '2';
tmp[++j] = '0';
}
else
{
tmp[j] = string[i];
}
j++;
}
return tmp;
}
void ReplaceBlank2(char *string,int length)
{
if(string == NULL || length<0)
{
return;
}
int old = 0;
int black = 0;
int i = 0;
while(string[i] != '\0')
{
old++;
if(string[i] == ' ')
{
black++;
}
i++;
}
int newlen = old + black*2 +1;//得到新的串的大小
for(int j = old+1;j>=0;--j)
{
if(string[j] != ' ') //如果不等于空格,则一直插入即可
{
string[newlen--] = string[j];
}
else //如果等于空格,就进行替换
{
string[newlen--] = '0';
string[newlen--] = '2';
string[newlen--] = '%';
}
}
}
int main()
{
char arr[50] = "We are student. ";
int length = sizeof(arr)/sizeof(arr[0]);
char *tmp = ReplaceBlank1(arr);
ReplaceBlank2(arr,50);
printf("%s\n",arr);
printf("%s\n",tmp);
free(tmp);
}
总结:学会找到最简单的办法,时间和空间复杂度越小越好咯。