空格替换 --九度1510
- 题目描述:
-
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
- 输入:
-
每个输入文件仅包含一组测试样例。
对于每组测试案例,输入一行代表要处理的字符串。
- 输出:
-
对应每个测试案例,出经过处理后的字符串。
- 样例输入:
-
We Are Happy
- 样例输出:
-
We%20Are%20Happy
开始做这道题时,理解不大正确,我的理解是将连续的空格当作单词之间的分隔符,针对连续的空格只输出一个%20。这样,就将问题转换成单词的识别问题了,将一个字符串中的单词识别出来,并在每个单词的末尾添加一个替换字符。
但是题目真正的要求是,将每一个空格都进行一次替换。
这两种方法解题的思路都差不多,将每个单词开始位置的指针记录下来,在这个单词结束的时候,添加一个'\0'作为字符串结束的标志,因此就可以将这个单词直接进行输出(利用到的性质主要就是字符串的输出以\0结束),而不需要另外开辟其他的空间。
由于输入中并没有指定输入的最大长度,所以可能输入的长度可长可短。所以此时,采用的方法就是动态分配内存,先分配一个固定大小的内存,然后在需要的时候再增加固定的长度,使用realloc(source,size)实现。当然,也可以一开始就分配一个较大的空间,节省后续空间分配的时间开销。
代码如下所示:
#include<stdio.h> #include<stdlib.h> #include<string.h> #define N 100 /* 将原来的字符串a中的空格用insertString代替.这种方法是将连续的空格作为一个空格 */ void replaceSpace(char* a,int len,char *insertString){ bool isSpace = true; char** address = (char ** )malloc(sizeof(char *)*len); int count=0; // 记录单词的个数 for(int i=0;i<len;i++){ if(a[i]==' '&& !isSpace ){ //一个单词结束,需要将之前的单词记录下来 a[i]='\0'; isSpace = true; }else if(a[i]!= ' '&& isSpace){ //开始一个新的单词 address[count] = &a[i]; count++; isSpace = false; }else{ // 单词内部或者连续的空格,不做处理 } } if(a[0]==' '){ printf("%s",insertString); } for(int i=0;i<count;i++){ printf("%s%s",address[i],insertString); } printf("\n"); } /* 将原来的字符串a中的空格用insertString代替.这种方法是将每一个空格都作一次单独的替换,跟word中的替换类似 */ void replaceSpaceOneByOne(char* a,int len,char *insertString){ bool isSpace = true; char* address; for(int i=0;i<len;i++){ if(a[i]==' '&& !isSpace ){ //一个单词结束,将之前的单词输出,并且输出替换字符串 a[i]='\0'; printf("%s%s",address,insertString); isSpace = true; }else if(a[i]!= ' '&& isSpace){ //开始一个新的单词,需要将开始地址记录下来 address = &a[i]; isSpace = false; }else if(a[i]==' '&& isSpace){ // 连续的空格,输出替换字符串 printf("%s",insertString); }else{ // 单词内部,不做任何处理 } } if(!isSpace){ printf("%s",address); } printf("\n"); } int main(int argc, char *argv[]) { char insertString[]="%20"; //动态接收输入,数组的长度不确定,先开辟一个固定大小的空间,在不够用时动态增加 char* a= (char *)malloc(sizeof(int)*N); char* tmp; char ch; int count=0; ch = getchar(); while(ch!='\n'){ if(count==N){ //数组已满,需要重新分配空间 tmp = (char *)realloc(a,count+N); a = tmp; } a[count++]=ch; ch = getchar(); } a[count]='\0'; int len = strlen(a); /*replaceSpace(a,len,insertString);*/ replaceSpaceOneByOne(a,len,insertString); return 0; } /************************************************************** Problem: 1510 User: jingxmu Language: C++ Result: Accepted Time:30 ms Memory:1020 kb ****************************************************************/
另外给出的参考解答,个人认为空间开销太大,而且不具有通用性(利用到了%20的性质)。 【解析】
posted on 2014-07-04 10:44 jing77jing 阅读(254) 评论(0) 编辑 收藏 举报