剑指offer面试题:替换空格

https://blog.csdn.net/yanxiaolx/article/details/52235212

 题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。


解析:时间复杂度为O(n)的解法。







完整代码及测试用例实现:

[cpp] view plaincopy
  1. #include<iostream>  
  2. using namespace std;  
  3. #include <cstring>  
  4.   
  5. //length 为字符数组string的总容量  
  6. void ReplaceBlank(char string[], int length)  
  7. {  
  8.     if (string == NULL&&length <= 0)  
  9.     {  
  10.         return;  
  11.     }  
  12.     //reallyLength 为字符串string的实际长度  
  13.     int reallyLength = 0, numberOfBlank = 0,i=0;  
  14.       
  15.     while (string[i]!='\0')  
  16.     {  
  17.         ++reallyLength;  
  18.   
  19.         if (string[i] == ' ')  
  20.         {  
  21.             ++numberOfBlank;  
  22.         }  
  23.         ++i;  
  24.     }  
  25.   
  26.     //newLength 为把空格替换成'%20'之后的长度  
  27.     int newLength = reallyLength + numberOfBlank * 2;  
  28.     if (newLength > length)  
  29.     {  
  30.         return;  
  31.     }  
  32.   
  33.     int indexOfReally = reallyLength;  
  34.     int indexOfNew = newLength;  
  35.     while (indexOfReally >= 0 && indexOfNew >indexOfReally)  
  36.     {  
  37.         if (string[indexOfReally] == ' ')  
  38.         {  
  39.             string[indexOfNew--] = '0';  
  40.             string[indexOfNew--] = '2';  
  41.             string[indexOfNew--] = '%';  
  42.         }  
  43.         else  
  44.         {  
  45.             string[indexOfNew--] = string[indexOfReally];  
  46.         }  
  47.   
  48.         --indexOfReally;  
  49.     }  
  50. }  
  51.   
  52.   
  53. // ====================测试代码====================  
  54. void Test(char* testName, char string[], int length, char expected[])  
  55. {  
  56.     if (testName != NULL)  
  57.     {  
  58.         cout << testName << " begins: ";  
  59.     }  
  60.   
  61.     ReplaceBlank(string, length);  
  62.   
  63.     if (expected == NULL && string == NULL)  
  64.     {  
  65.         cout << "passed." << endl;  
  66.     }  
  67.     else if (expected == NULL && string != NULL)  
  68.     {  
  69.         cout << "failed." << endl;  
  70.     }  
  71.     else if (strcmp(string, expected) == 0)  
  72.     {  
  73.         cout << "passed." << endl;  
  74.     }  
  75.     else  
  76.     {  
  77.         cout << "failed." << endl;  
  78.     }  
  79. }  
  80.   
  81.   
  82. void Test1()  
  83. {  
  84.     // 空格在句子中间  
  85.     const int length = 100;  
  86.   
  87.     char string[length] = "we are happy.";  
  88.     Test("Test1", string, length, "we%20are%20happy.");  
  89. }  
  90.   
  91.   
  92. void Test2()  
  93. {  
  94.     // 空格在句子开头  
  95.     const int length = 100;  
  96.   
  97.     char string[length] = " wearehappy.";  
  98.     Test("Test2", string, length, "%20wearehappy.");  
  99. }  
  100.   
  101. void Test3()  
  102. {  
  103.     // 空格在句子末尾  
  104.     const int length = 100;  
  105.   
  106.     char string[length] = "wearehappy. ";  
  107.     Test("Test3", string, length, "wearehappy.%20");  
  108. }  
  109.   
  110. void Test4()  
  111. {  
  112.     // 连续有两个空格  
  113.     const int length = 100;  
  114.   
  115.     char string[length] = "we  are happy.";  
  116.     Test("Test4", string, length, "we%20%20are%20happy.");  
  117. }  
  118.   
  119. void Test5()  
  120. {  
  121.     // 传入NULL  
  122.     Test("Test5", NULL, 0, NULL);  
  123. }  
  124.   
  125. void Test6()  
  126. {  
  127.     // 传入内容为空的字符串  
  128.     const int length = 100;  
  129.   
  130.     char string[length] = "";  
  131.     Test("Test6", string, length, "");  
  132. }  
  133.   
  134. void Test7()  
  135. {  
  136.     //传入内容为一个空格的字符串  
  137.     const int length = 100;  
  138.   
  139.     char string[length] = " ";  
  140.     Test("Test7", string, length, "%20");  
  141. }  
  142.   
  143. void Test8()  
  144. {  
  145.     // 传入的字符串没有空格  
  146.     const int length = 100;  
  147.   
  148.     char string[length] = "wearehappy.";  
  149.     Test("Test8", string, length, "wearehappy.");  
  150. }  
  151.   
  152. void Test9()  
  153. {  
  154.     // 传入的字符串全是空格  
  155.     const int length = 100;  
  156.   
  157.     char string[length] = "   ";  
  158.     Test("Test9", string, length, "%20%20%20");  
  159. }  
  160.   
  161. int main()  
  162. {  
  163.     Test1();  
  164.     Test2();  
  165.     Test3();  
  166.     Test4();  
  167.     Test5();  
  168.     Test6();  
  169.     Test7();  
  170.     Test8();  
  171.     Test9();  
  172.   
  173.     system("pause");   
  174.     return 0;  
  175. }  


运行结果:

Test1 begins: passed.

Test2 begins: passed.

Test3 begins: passed.

Test4 begins: passed.

Test5 begins: passed.

Test6 begins: passed.

Test7 begins: passed.

Test8 begins: passed.

Test9 begins: passed.

请按任意键继续. . .


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库原理及应用【一】引言

什么是数据库&#xff1a;一个大规模的集成的数据集合 作用&#xff1a;描述现实世界的实体(entities)以及实体之间的关系 管理数据库的系统软件&#xff1a;DBMS 文件是一个平滑的字符流&#xff0c;无法完成信息的检索和管理 数据&#xff08;data&#xff09;:用来描述现…

用c++模拟实现一个学生成绩管理系统

https://blog.csdn.net/yanxiaolx/article/details/53393437题目&#xff1a;用c模拟实现一个学生成绩的信息管理系统&#xff0c;要求能添加、删除、修改、查看和保存学生的信息等功能 源代码如下:[cpp] view plaincopy#define _CRT_SECURE_NO_WARNINGS #include<iostr…

Python3列表

操作&#xff1a;索引、切片、加、乘、检查成员、确定序列长度、确定最大最小元素 定义&#xff1a; 列表名 [元素]下标列表名[x] 截取:列表名[x:y] 更新&#xff1a; list[x]y 或者使用append()方法添加列表项删除&#xff1a; del list[x]常用操作&#xff1a; 截取与…

Linux惊群效应详解(最详细的了吧)

https://blog.csdn.net/lyztyycode/article/details/78648798?locationNum6&fps1 linux惊群效应详细的介绍什么是惊群&#xff0c;惊群在线程和进程中的具体表现&#xff0c;惊群的系统消耗和惊群的处理方法。1、惊群效应是什么&#xff1f;惊群效应也有人叫做雷鸣群体效应…

epoll原理详解(最清晰)

https://blog.csdn.net/lyztyycode/article/details/79491419我只是把内容搬运过来做个记录&#xff0c;方便自己以后回头看。第一部分&#xff1a;select和epoll的任务关键词&#xff1a;应用程序 文件句柄 用户态 内核态 监控者要比较epoll相比较select高效在什么地方&#x…

Ubuntu卸载软件

用过使用dpkg软件管理工具得到所有已经安装的软件&#xff0c;如果不清楚软件的全名可以使用grep命令进行查找 然后再使用sudo apt-get remove --purge 软件名卸载软件&#xff08;--purge参数会删除配置文件&#xff0c;删的干净一些&#xff09; 例如&#xff1a;

一个重要且实用的signal---SIGCHLD

https://blog.csdn.net/lyztyycode/article/details/78150805SIGCHLD(修改)因为笔者之前的文章里面有错误&#xff0c;今天发现&#xff0c;立马做个修改。在下面我的一段关于sigchld信号相对于直接调用wait函数的好处时&#xff0c;我说调用wait函数要一直检测子进程是否执行完…

Python3函数和代码复用

函数的定义 def 函数名([参数列表]):注释函数体注意事项 函数形参不需要声明类型&#xff0c;可以使用return语句在结束函数执行的同时返回任意类型的值&#xff0c;函数返回值类型与return语句返回表达式i的类型一致 即使该函数不需要接受任何参数&#xff0c;也必须保留一堆…

一文说尽C++赋值运算符重载函数(operator=)

http://www.cnblogs.com/zpcdbky/p/5027481.html在前面&#xff1a;关于C的赋值运算符重载函数(operator)&#xff0c;网络以及各种教材上都有很多介绍&#xff0c;但可惜的是&#xff0c;内容大多雷同且不全面。面对这一局面&#xff0c;在下在整合各种资源及融入个人理解的基…

Python a和a[:]的区别

简单来讲a[:]是深复制&#xff0c;a是浅复制&#xff0c;相当于赋值a的话是赋值了指针&#xff0c;赋值a[:]相当于复制了a对应的那段空间 例如&#xff1a; a [1,1,1,1,1,1]for x in a:if x1:a.remove(x)print(a)运行结果&#xff1a; remove操作是移除序列中第一个x元素。…

Linux系统【二】exec族函数及应用

文件描述符 文件描述符表是一个指针数组&#xff0c;文件描述符是一个整数。 文件描述符表对应的指针是一个结构体&#xff0c;名字为file_struct&#xff0c;里面保存的是已经打开文件的信息 需要注意的是父子进程之间读时共享&#xff0c;写时复制的原则是针对物理地址而言…

白话C++系列(27) -- RTTI:运行时类型识别

http://www.cnblogs.com/kkdd-2013/p/5601783.htmlRTTI—运行时类型识别 RTTI&#xff1a;Run-Time Type Identification。 那么RTTI如何来体现呢&#xff1f;这就要涉及到typeid和dynamic_cast这两个知识点了。为了更好的去理解&#xff0c;那么我们就通过一个例子来说明。这个…

使用头文件的原因和规范

原因 通过头文件来调用库功能。在很多场合&#xff0c;源代码不便&#xff08;或不准&#xff09;向用户公布&#xff0c;只 要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库 功能&#xff0c;而不必关心接口怎么实现的。编译器会从库中提取相应…

转圈踢人问题

https://www.cnblogs.com/lanxuezaipiao/p/3339603.html 有N个人围一圈依次报数&#xff0c;数到3的倍数的人出列&#xff0c;问当只剩一个人时他原来的位子在哪里&#xff1f; 解答&#xff1a;经典的转圈踢人问题&#xff0c;好吧专业一点&#xff0c;约瑟夫环问题&#xff0…

Python3常用数据结构

Python3中有三种组合数据类型&#xff0c;分别为&#xff1a; 序列类型&#xff1a;字符串&#xff08;str&#xff09;、元组&#xff08;tuple&#xff09;、列表&#xff08;list&#xff09;集合类型&#xff1a;集合&#xff08;set&#xff09;映射类型&#xff1a;字典…

TCP第四次挥手为什么要等待2MSL

当客户端进入TIME-WAIT状态的时候(也就是第四次挥手的时候)&#xff0c;必须经过时间计数器设置的时间2MSL(最长报文段寿命)后&#xff0c;才能进入关闭状态&#xff0c;这时为什么呢&#xff1f;&#xff1f;&#xff1f; 这最主要是因为两个理由&#xff1a; 1、为了保证客户…

计算机网络【一】概述+OSI参考模型

网络概述 局域网:覆盖范围小(100m以内)&#xff0c;自己花钱买设备&#xff0c;带宽固定(10M,100M,1000M)&#xff0c;自己维护&#xff08;接入层交换机直接连接电脑、汇聚层交换机直接连接接入层交换机&#xff09; 广域网:距离远&#xff0c;花钱买服务&#xff0c;租带宽&…

单链表逆序的多种方式

https://www.cnblogs.com/eniac12/p/4860642.htmltemplate<class T> void List<T>::Inverse() {if(first NULL) return;LinkNode<T> *p, *prev, *latter; p first->link;   // 当前结点prev NULL;   // 前一结点l…

socket编程 -- epoll模型服务端/客户端通信的实现

https://blog.csdn.net/y396397735/article/details/50680359 本例实现如下功能&#xff1a; 支持多客户端与一个服务端进行通信&#xff0c;客户端给服务端发送字符串数据&#xff0c;服务端将字符串中小写转为大写后发送回客户端&#xff0c;客户端打印输出经转换后的字符串。…

Python3 面向对象程序设计

类的定义 Python使用class关键字来定义类 class Car:def infor(self):print("This is a car") car Car() car.infor()内置方法isinstance()来测试一个对象是否为某个类的实例 self参数 类的 所有实例方法都有一个默认的self参数&#xff0c;并且必须是方法的第一…