题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”,则输出“We%20are%20happy.”。
        应用背景:在网络编程中,如果URL参数中含有特殊字符,如空格、'#'等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在'%'后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成"%20"。再比如'#'的ASCII码为35,即十六进制的0x23,它在URL中被替换为"%23"。

知识长进:

  1. 为了节省内存,C/C++把常量字符串放到单独的一个内存区域,当几个指针赋值给相同的常量字符串时,他们实际上会指向相同的内存。
  2. 在合并两个数组(包括字符串)时,如果从前往后复制每个数字则需要重复移动数字多次,那么可以逆向思维,考虑从后往前复制,这样子可以减少移动的次数,从而提高效率,但是要注意内存覆盖问题。
  3. 在清楚空格中,清除空格后所得到的字符串要比原先的字符串要短,我们从头到尾进行清楚空格的话就不会覆盖到空格后面的字符,所以我们可以从头开始清除,效率反而比较高。

相比源代码的改进点:因为C/C++中每个字符串都以字符‘\0’作为结尾,所以源代码中if(newLength > length)存在溢出风险,修正为if((newLength+1) > length)。

***********************************************************************************

算法实现:如果从前往后替换字符串,那么保存在空格后面的字符串肯定会被覆盖,那么我们就考虑从后往前进行替换。

  1. 首先遍历原字符串,找出字符串的长度以及其中的空格数量,
  2. 根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度。
  3. 设置两个指针point1和point2分别指向原字符串和新字符串的末尾位置。
  4. 如果point1指向内容不为空格,那么将内容赋值给point2指向的位置,如果point1指向为空格,那么从point2开始赋值“%20”
  5. 直到point1==point2时表明字符串中的所有空格都已经替换完毕。
    #include<cstdio>
    #include<cstring> /*length为字符数组string的总容量*/
    void ReplaceBlank(char string[], int length)
    {
    //特殊输入,鲁棒性
    if (string == nullptr || length <= )
    return; //计算空格的数量
    int i = ;
    int originalLength = ;
    int numberOfBlank = ;
    while (string[i]!='\0') //字符串结尾
    {
    if (string[i] == ' ')
    numberOfBlank++;
    originalLength++;
    ++i;
    }
    /*newLength为把空格替换成'%20'之后的长度*/
    int newLength = originalLength + * numberOfBlank;
    //鲁棒性,自己未考虑到,考虑最后字符串的空格
    if (newLength > (length-))
    return; int indexOfOriginal = originalLength;
    int indexOfNew = newLength;
    while (indexOfNew>indexOfOriginal && indexOfOriginal>=)
    {
    if (string[indexOfOriginal] == ' ')
    {
    //空格,新字符串替换为‘%20’
    string[indexOfNew--] = '';
    string[indexOfNew--] = '';
    string[indexOfNew--] = '%';
    indexOfOriginal--;
    }
    else
    {
    string[indexOfNew--] = string[indexOfOriginal--];
    }
    }
    } // ====================测试代码====================
    void Test(char* testName, char str[], int length, char expected[])
    {
    if (testName != nullptr)
    printf("%s begins: ", testName); ReplaceBlank(str, length); if (expected == nullptr && str == nullptr)
    printf("passed.\n");
    else if (expected == nullptr && str != nullptr)
    printf("failed.\n");
    else if (strcmp(str, expected) == )
    //字符串相等
    printf("passed.\n");
    else
    printf("failed.\n");
    } // 空格在句子中间
    void Test1()
    {
    const int length = ; char str[length] = "hello world";
    Test("Test1", str, length, "hello%20world");
    } // 空格在句子开头
    void Test2()
    {
    const int length = ; char str[length] = " helloworld";
    Test("Test2", str, length, "%20helloworld");
    } // 空格在句子末尾
    void Test3()
    {
    const int length = ; char str[length] = "helloworld ";
    Test("Test3", str, length, "helloworld%20");
    } // 连续有两个空格
    void Test4()
    {
    const int length = ; char str[length] = "hello world";
    Test("Test4", str, length, "hello%20%20world");
    } // 传入nullptr
    void Test5()
    {
    Test("Test5", nullptr, , nullptr);
    } // 传入内容为空的字符串
    void Test6()
    {
    const int length = ; char str[length] = "";
    Test("Test6", str, length, "");
    } //传入内容为一个空格的字符串
    void Test7()
    {
    const int length = ; char str[length] = " ";
    Test("Test7", str, length, "%20");
    } // 传入的字符串没有空格
    void Test8()
    {
    const int length = ; char str[length] = "helloworld";
    Test("Test8", str, length, "helloworld");
    } // 传入的字符串全是空格
    void Test9()
    {
    const int length = ; char str[length] = " ";
    Test("Test9", str, length, "%20%20%20");
    } int main(int argc, char* argv[])
    {
    Test1();
    Test2();
    Test3();
    Test4();
    Test5();
    Test6();
    Test7();
    Test8();
    Test9();
    getchar();
    return ;
    }

《剑指Offer》面试题5-替换空格的更多相关文章

  1. 剑指offer面试题4 替换空格(java)

    注:利用java中stringBuilder,append,length方法很方便的解决字符串问题 /* * 剑指offer 替换空格 * xsf * */ /*开始替换空格的函数,length为原数 ...

  2. 剑指offer面试题4 替换空格(c)

  3. 剑指Offer:面试题4——替换空格(java实现)

    问题描述:请实现一个函数,把字符串中的每个空格替换成"%20". 例如: 输入:"We are happy." 输出:"We%20are%20happ ...

  4. C++版 - 剑指offer 面试题4: 替换空格 题解

    面试题4:替换空格 提交网址: http://www.nowcoder.com/practice/4060ac7e3e404ad1a894ef3e17650423?tpId=13&tqId=1 ...

  5. 剑指Offer编程题2——替换空格

    剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...

  6. 剑指Offer - 九度1510 - 替换空格

    剑指Offer - 九度1510 - 替换空格2013-11-29 20:53 题目描述: 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之 ...

  7. 剑指offer第二版-5.替换空格

    面试题5:替换空格 题目要求: 实现一个函数,把字符串中的每个空格都替换成“%20”,已知原位置后面有足够的空余位置,要求改替换过程发生在原来的位置上. 思路: 首先遍历字符串求出串中空格的数量,求出 ...

  8. 剑指offer(2)替换空格

    题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 题目分析 我们如果要替换空格,两步 ...

  9. 剑指offer【02】- 替换空格(Java)

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

  10. 剑指Offer(4)——替换空格

    题目: 请实现一个函数,把字符串中的每个空格替换成"%20".例如输入“We are happy.”,则输出“We%20are%20happy.”. 思路: 如果按照顺序从前往后依 ...

随机推荐

  1. 多线程面试题系列(3):原子操作 Interlocked系列函数

    上一篇中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是否运行出错.这也非常类似于统计一个网站每天有多少用户登录,每个用户登录用一个线程模拟,线程运行时会将 ...

  2. Map.containsKey方法——判断Map集合对象中是否包含指定的键名

    该方法判断Map集合对象中是否包含指定的键名.如果Map集合中包含指定的键名,则返回true,否则返回false. public static void main(String[] args) { M ...

  3. 06jQuery-03-选择器查找和过滤

    1.查找 find().parent().prev().next() 通常情况下选择器可以直接定位到我们想要的元素,但是,当我们拿到一个jQuery对象后,还可以以这个对象为基准,进行查找和过滤. 最 ...

  4. Linux环境下MySQL数据库用SQL语句插入中文显示 “问号或者乱码 ” 问题解决!

    问题: 在普通用户权限下执行 mysql -u root -p进入mysql数据库,中间步骤省略,插入数据:insert into 库名(属性)values('汉字'); 会出现如下提示:  Quer ...

  5. hdfs存取文件机制

    HDFS和HBase是Hadoop中两种主要的存储文件系统,两者适用的场景不同,HDFS适用于大文件存储,HBASE适用于大量小文件存储.本文主要讲解HDFS文件系统中客户端是如何从Hadoop集群中 ...

  6. [python学习笔记] 运算符

    数学运算符 与大多语言相同的运算符就不介绍了.不同的地方会用 (!不同)标出 与java相同的运算符 , - , * , % , / 不同之处 除法 (!不同) /  与java不同,整数相除,结果为 ...

  7. JQuery中关于浏览器兼容性的问题

      前  言 LIUWE JQuery是一个特别强大的javascript代码库,,它的操作DOM的能力是相当强大的,JQuery可以说是支持各大主流浏览器,但是随着时代的不断发展,浏览器是在不断的更 ...

  8. Matlab入门学习(矩阵、函数、绘图的基本使用)

    一.矩阵 1.定义和简单使用(一般的编程语言,数组下标都是从0开始的,但是MATLAB是从1开始的) >> a=[ ; ; ] a = >> b=[ ; ; ]; >&g ...

  9. BZOJ-1012-[JSOI2008]最大数maxnumber(线段树)

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...

  10. 自定义流程gooflow2.0+自定义表单

    一.功能简介 gooflow功能清单1.自定义流程绘制2.自定义属性添加3.支持3种步骤类型普通审批步骤自动决策步骤手动决策步骤 4.决策方式(支持js决策,sql语句决策) 5.审批人员参与方式,可 ...