剑指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;:用来描述现…

Linux命令【三】gcc编译+静态库+动态库+makefile+gdb调试

用C编译器编译源文件&#xff1a;gcc 源文件 -o 可执行文件名 详细步骤&#xff1a; gcc -E a.c -o a.i预处理器将头文件展开&#xff0c;宏替换&#xff0c;去掉注释gcc -S a.i -o a.s编译器将C文件变成汇编文件gcc -c a.s -o a.o汇编器将会变文件变成二进制文件gcc a.o -o a…

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

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

Linux命令【四】文件+虚拟内存+常用系统函数

File*其实是一个结构体 文件描述符FD&#xff1a;索引到对应的磁盘文件文件读写位置指针FP_POS&#xff0c;如果同时读写需要注意文件指针的位置I/O缓冲区BUFFER&#xff1a;保存内存指针&#xff0c;默认大小是8kb&#xff0c;用于减小我们对硬盘操作的次数。因为我们对硬盘的…

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…

Linux命令【五】系统函数

系统文件函数 stat函数 指针如果没有const一般表示传出参数&#xff0c;如果加const表示传入参数 struct stat dev_t st_dev文件设备编号ino_t st_ino节点 inode号是唯一的&#xff0c;每个inode节点的大小一般是128字节活着256字节&#xff0c;一般文件每2KB就设置一个ino…

生产者-消费者模型的两种实现方式

https://www.cnblogs.com/caolicangzhu/p/7086176.html本文主要来总结生产者-消费者模型的代码实现,至于其原理,请大家自行百度. 一、基于链表的生产-消费模型(条件变量)我们以链表为例,生产者进行头部插入,消费者进行头部删除,因此,先将链表相关操作封装为LinkList.h,具体代码…

Linux系统【一】CPU+MMU+fork函数创建进程

切板中的内容输出到文件### 进程相关概念 程序&#xff1a;编译好的二进制文件&#xff0c;在磁盘上&#xff0c;不占用系统资源&#xff08;不包括磁盘&#xff09;。&#xff08;剧本&#xff09; 进程&#xff1a;占用系统资源&#xff0c;是程序的一次运行。&#xff08;戏…

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函数要一直检测子进程是否执行完…

数据结构实验之链表七:单链表中重复元素的删除

https://blog.csdn.net/blessingxry/article/details/794455111.知识点&#xff1a;逆序建立链表&#xff0b;节点删除 2.题意&#xff1a;按照数据输入的相反顺序&#xff08;逆位序&#xff09;建立一个单链表&#xff0c;并将单链表中重复的元素删除&#xff08;值相同的元素…

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元素。…

约瑟夫环(c语言程序完整版)

https://blog.csdn.net/m_hahahaha1994/article/details/51742453约瑟夫环&#xff08;约瑟夫问题&#xff09;是一个数学的应用问题&#xff1a;已知n个人&#xff08;以编号1&#xff0c;2&#xff0c;3…n分别表示&#xff09;围坐在一张圆桌周围。从编号为k的人开始报数&am…

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;而不必关心接口怎么实现的。编译器会从库中提取相应…