题目:请实现一个函数,把字符串中的每个空格替换成"%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 <= 0)return;//计算空格的数量int i = 0;int originalLength = 0;int numberOfBlank = 0;while (string[i]!='\0') //字符串结尾
        {if (string[i] == ' ')numberOfBlank++;originalLength++;++i;}/*newLength为把空格替换成'%20'之后的长度*/int newLength = originalLength + 2 * numberOfBlank;//鲁棒性,自己未考虑到,考虑最后字符串的空格if (newLength > (length-1))return;int indexOfOriginal = originalLength;int indexOfNew = newLength;while (indexOfNew>indexOfOriginal && indexOfOriginal>=0){if (string[indexOfOriginal] == ' '){//空格,新字符串替换为‘%20’string[indexOfNew--] = '0';string[indexOfNew--] = '2';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) == 0)//字符串相等printf("passed.\n");elseprintf("failed.\n");
    }// 空格在句子中间
    void Test1()
    {const int length = 100;char str[length] = "hello world";Test("Test1", str, length, "hello%20world");
    }// 空格在句子开头
    void Test2()
    {const int length = 100;char str[length] = " helloworld";Test("Test2", str, length, "%20helloworld");
    }// 空格在句子末尾
    void Test3()
    {const int length = 100;char str[length] = "helloworld ";Test("Test3", str, length, "helloworld%20");
    }// 连续有两个空格
    void Test4()
    {const int length = 100;char str[length] = "hello  world";Test("Test4", str, length, "hello%20%20world");
    }// 传入nullptr
    void Test5()
    {Test("Test5", nullptr, 0, nullptr);
    }// 传入内容为空的字符串
    void Test6()
    {const int length = 100;char str[length] = "";Test("Test6", str, length, "");
    }//传入内容为一个空格的字符串
    void Test7()
    {const int length = 100;char str[length] = " ";Test("Test7", str, length, "%20");
    }// 传入的字符串没有空格
    void Test8()
    {const int length = 100;char str[length] = "helloworld";Test("Test8", str, length, "helloworld");
    }// 传入的字符串全是空格
    void Test9()
    {const int length = 100;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 0;
    }

转载于:https://www.cnblogs.com/DHUtoBUAA/p/7224526.html

《剑指Offer》面试题5-替换空格相关推荐

  1. 剑指offer面试题:替换空格

    https://blog.csdn.net/yanxiaolx/article/details/52235212 题目:请实现一个函数,把字符串中的每个空格替换成"%20".例如输 ...

  2. 剑指Offer - 面试题5. 替换空格(字符串)

    1. 题目 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are happy." 输出:"We%20 ...

  3. 剑指offer面试题05. 替换空格

    题目描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 思路 详见链接 在 Python 和 Java 等语言中,字符串都被设计成不可变的类型,即无法直接修改字符串 ...

  4. leetcode刷题之 剑指offe 面试题05. 替换空格 犯傻记录

    2020.3.6 刷到剑指offer第5题,题目描述如下: 题目本身没啥好说的,就是先统计空格的个数,然后把长度增加,用两个指针从后往前插. 采用m = s.count(' ',0,len(s)-1) ...

  5. 剑指offer习题详解——替换空格(全网最全详细解答,多种语言,多种解法)

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

  6. 【剑指Offer面试题】 九度OJ1510:替换空格

    c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...

  7. 剑指offer——面试题4:替换空格

    #剑指offer--面试题4:替换空格 此题的关键思路在于字符串的从后向前复制!!! class Solution { public:void replaceSpace(char *str,int l ...

  8. 剑指offer——面试题49:把字符串转换成整数

    剑指offer--面试题49:把字符串转换成整数 Solution1: 代码写的啰嗦,但思路清晰..LeetCode上有相似的题目并考虑了溢出,可以参考LeetCode8答案 class Soluti ...

  9. 剑指offer 面试题三 找出数组中重复的数字

    1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...

  10. [剑指offer]面试题第[68-2]题[Leetcode][第236题][JAVA][二叉搜索树的最近公共祖先][递归]

    [问题描述][中等] 235/68-1 搜索二叉树 236/68-2 二叉树 [解答思路] 递归 时间复杂度:O(N) 空间复杂度:O(N) 情况 1. , 2. , 3. , 4. 的展开写法如下. ...

最新文章

  1. 【跃迁之路】【425天】刻意练习系列184—SQL(2018.04.06)
  2. 5.4Python数据处理篇之Sympy系列(四)---微积分
  3. vba 修改access表的链接地址_VBA中常用的这7种数据类型,你都get到了吗?
  4. 关系数据库中,表中的每行就是一个对象
  5. STL vector的erase操作问题
  6. Django 之 权限系统(组件)
  7. 垃圾收集器–串行,并行,CMS,G1(以及Java 8中的新增功能)
  8. Linux内核调试debugfs
  9. SpringBoot-Jsoup做java简单-爬虫
  10. 关于Spring的几个问题
  11. 腾讯终于摘掉“游戏公司”帽子!B端业务也稳了
  12. ViewPager——基础知识和PagerAdapter必须重写的四个方法
  13. python入门先学什么-C和Python我该先学什么?
  14. 19【推荐系统13】FNN——TensorFlow2实现
  15. 在VT上搜索恶意软件
  16. java 兔子问题_Java算法之“兔子问题”
  17. Guys, what is better than sex?
  18. django1.8下的markdown、highlight、pagedown解决
  19. mysql远程服务器返回错误404_服务器常见页面访问返回错误信息(404 500 400)表示什么意思...
  20. Java案例2-1商品入库

热门文章

  1. html中transition默认,CSS3中的Transition详解
  2. html中鼠标移走的伪元素,a标签的伪元素的应用——link,hover,visited,active
  3. python工作目录,如何使用python 3获取当前工作目录?
  4. 使用ggplot2画图
  5. 2014-7 Andrew Ng 自动化所报告听后感
  6. python定义变量类型列子_Python系列课程-变量类型
  7. 前景检测算法(十三)--KDE2000
  8. matlab进行ai研究,matlab【人工智能项目】—ELM地质分类研究
  9. Hive ntile函数
  10. scala循环 方法与函数