标签:style blog color strong 2014 问题
题目描述:
请实现一个函数,把字符串的每个空格替换成"%20"。例如输入"We are happy.",则输出"We%20are%20happy.".
分析描述:
方法一:对于给定的字符串,可以从前往后遍历整个字符串,遇到第一个空格时,就用"%20"替换空格,并将后面的字符向后移动,遇到第二个空格时,继续用"%20"替换空格,并将其后面的字符向后移动,依次类推,直到遇到结束符‘\0‘。这种方法的优点是简单易懂,确定是后面的字符要移动不止一次,算法的时间复杂度为O(n*n)。
方法二:以相反的思路来思考这个问题,把从前向后替换改成从后向前替换。这样对于需要移动的字符,只需要移动一次即可。时间复杂度为O(n)。我们可以先遍历一次字符串,这样就能统计出字符串中空格的总数,并可由此计算出替换之后的字符串的总长度。
程序示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void replaceblank(char string[], int length);
int
main(int argc, char **argv)
{
char string[1000] = "We are happy.";
replaceblank(string, 1000);
return -1;
}
void replaceblank(char string[], int length)
{
if(string == NULL || length <= 0){
printf("element fail.\n");
return;
}
int originallength = 0;
int numberofblank = 0;
int i = 0;
while(string[i] != '\0'){
originallength++;
if(string[i] == ' ')
numberofblank++;
++i;
}
int newlength = originallength + numberofblank * 2;
if(newlength > length)
return;
int indexoforiginal = originallength;
int indexofnew = newlength;
while(indexoforiginal >= 0 && indexofnew > indexoforiginal){
if(string[indexoforiginal] == ' '){
string[indexofnew--] = '0';
string[indexofnew--] = '2';
string[indexofnew--] = '%';
}else{
string[indexofnew--] = string[indexoforiginal];
}
indexoforiginal--;
}
printf("string[1000] = %s\n", string);
}编译后运行结果如下:
string[1000] = We%20are%20happy.
总结:
1、对于字符串来讲,反向思路,从后往前考虑字符串也是一种思路。
2、对于字符数组做为函数的参数时,其实传递的是指向数组第一个元素的指针。
标签:style blog color strong 2014 问题
原文地址:http://blog.csdn.net/to_be_it_1/article/details/36010531