• 替换空格


    题目

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

    思路

    1. 从头到尾遍历字符串做替换,时间复杂度为O(n2),效率低

    2.从尾到头遍历字符串做替换,时间复杂度为O(n),效率高

    实现

    1.边界检查,判断字符数组是否为空(替换前)

    2.遍历字符串,统计空格总数num_blank,统计替换前字符个数len,统计替换后字符个数new_len,其中new_len= len+ 2*num_blank

    3.边界检查,判断字符数组是否越界(替换后)

    4.替换空格,用指针P1指向原始字符串的末尾,指针P2指向替换后字符串的末尾。

      向前移动指针P1,如果P1指向的元素不是空格,则将P1指向的元素复制给P2指向的位置;

      如果P1指向的元素是空格,则P2依次向前移动并插入%20。当P1==P2时,结束替换。

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    class Soultation
    {
        public:
            void replace_blank(char *s,int length);
            void print(char *s);
    };
    void Soultation::replace_blank(char *s,int length)
    {
        if(s==NULL|length<=0)
            return;
        
        int len=strlen(s);//替换之前字符串的实际长度 
        int num_blank=0;
        for(int i=0;i<len;++i)//统计空格数 
            if(s[i]==' ')
                ++num_blank;
    
        int new_len=len+2*num_blank;//替换之后字符串的新的长度
        if(new_len+1>length)//检查替换后是否越界
            return;
             
        while(len>=0&&new_len>len)
        {
            if(s[len]==' ')//在替换完成空格之后len需要向前移动一个单位,需用len--,比较新的字符 
            {
                s[new_len--]='0';
                s[new_len--]='2';
                s[new_len--]='%';
            }
            else
                s[new_len--]=s[len];//不可len-- 
            --len;//在完成复制或空格替换之后都需要向前移动一个单位 
        }
    }
    
    void Soultation::print(char *s)
    {
        cout<<s<<endl;
    }
    int main()
    {
        char str[60]="hello word,i'm ok";
        Soultation s;
        s.replace_blank(str,60);
        s.print(str);
        return 0;
    }
  • 相关阅读:
    对公信贷系统与其他系统交互方式总结
    测试验收标准checklist
    测试风险汇报
    接口测试checklist
    52 | 深入浅出网站可扩展性架构设计
    51 | 深入浅出网站伸缩性架构设计
    html元素类型 块级元素、内联元素(又叫行内元素)和内联块级元素。(转载)
    IO流
    多线程
    Java网络编程
  • 原文地址:https://www.cnblogs.com/tianzeng/p/10076078.html
Copyright © 2020-2023  润新知