空格替换 --九度1510

题目描述:

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

输入:

每个输入文件仅包含一组测试样例。
对于每组测试案例,输入一行代表要处理的字符串。

输出:

对应每个测试案例,出经过处理后的字符串。

样例输入:
We Are Happy
样例输出:
We%20Are%20Happy
开始做这道题时,理解不大正确,我的理解是将连续的空格当作单词之间的分隔符,针对连续的空格只输出一个%20。这样,就将问题转换成单词的识别问题了,将一个字符串中的单词识别出来,并在每个单词的末尾添加一个替换字符。
但是题目真正的要求是,将每一个空格都进行一次替换。
这两种方法解题的思路都差不多,将每个单词开始位置的指针记录下来,在这个单词结束的时候,添加一个''作为字符串结束的标志,因此就可以将这个单词直接进行输出(利用到的性质主要就是字符串的输出以结束),而不需要另外开辟其他的空间。
由于输入中并没有指定输入的最大长度,所以可能输入的长度可长可短。所以此时,采用的方法就是动态分配内存,先分配一个固定大小的内存,然后在需要的时候再增加固定的长度,使用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]='';
                       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("
");
}
 
/*
    将原来的字符串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]='';
                    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("
");
}
 
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!='
'){
        if(count==N){ //数组已满,需要重新分配空间
            tmp = (char *)realloc(a,count+N);
            a = tmp;
        }
        a[count++]=ch;
        ch = getchar();
    }
    a[count]='';
    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的性质)。 【解析】

原文地址:https://www.cnblogs.com/jing77jing/p/3823890.html