zoukankan      html  css  js  c++  java
  • 空格替换 --九度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的性质)。 【解析】

  • 相关阅读:
    【PS技巧】常用概念和功能操作
    【存储】RAID磁盘阵列选择
    【Python 01】Python一种面向对象、解释型计算机程序设计语言
    【PS技巧】如何校正倾斜的图片
    【阿里巴巴大数据实践笔记】第14章:存储和成本管理
    【阿里巴巴大数据实践笔记】第13章:计算管理
    【阿里巴巴大数据实践笔记】第9章:阿里巴巴数据整合及管理体系
    今晚直播丨抢鲜体验-openGauss入门
    详述一则数据库死锁故障的分析过程
    前端学习笔记(一)HTML入门
  • 原文地址:https://www.cnblogs.com/jing77jing/p/3823890.html
Copyright © 2011-2022 走看看