面试题4:替换空格和清除空格

简介:

1.替换空格

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

1.1分析

将长度为1的空格替换为长度为3的“%20”,字符差的产度变长。如果允许我们开辟一个新的数组来存放替换空格后的字符串,那么这道题目就非常简单。设置两个指针分别指向新旧字符串首元素,遍历原字符串,如果碰到空格就在新字符串上填入“%20”,否则就复制元字符串上的内容。但是如果面试官要求在原先的字符串上操作,并且保证原字符串有足够长的空间来存放替换后的字符串,那么我们就得另想方法。

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

  1. 首先遍历原字符串,找出字符串的长度以及其中的空格数量,
  2. 根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度。
  3. 设置两个指针originalIndex和newIndex分别指向原字符串和新字符串的末尾位置。
  4. 如果originalIndex指向内容不为空格,那么将内容赋值给newIndex指向的位置,如果originalIndex指向为空格,那么从newIndex开始赋值“02%”
  5. 直到originalIndex==newIndex时表明字符串中的所有空格都已经替换完毕。

1.2代码实例

View Code

 

2.清除空格

题目:请实现一个函数,把字符串中的每个空格清除掉。例如输入“We are happy.”,则输出“Wearehappy.”。

2.1分析

这道题目是需要清楚空格,那么清除空格后所得到的字符串要比原先的字符串要短,这是我们从头到尾进行清楚空格的话就不会覆盖到空格后面的字符,所以我们可以从头开始清除。

  1. 设定两个指针p1和p2初始状态都指向字符串首字符。
  2. 如果p2指向的元素不为空格,那么将p2指向的内容赋值给p1,然后p1和p2指向下一个元素;如果p2指向的内容为空格,那么p2指向下一个元素。
  3. 直到p2指向字符串末尾的'\0'时清除空格结束。

2.2代码实例

View Code

 3.清楚多余空格

题目:给定字符串,删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。例如输入"  We   are   happy.   ",则输出"We are happy."

 3.1分析

这道题目跟第二题类似,都是需要删除空格,这样可以肯定输出的字符串长度小于等于原先字符串的长度,那么就可以从头往后遍历而不怕后面的字符被覆盖。因为需要删除开始和结尾处处的空格,而字符串中间的空格又需要保存一个,我们需要进行另外的处理。我们可以通过设置一个标识位来进行处理,定义一个bool变量keep_space表示是否保存一个空格,如果keep_space=true表示保存一个空格,如果keep_space=false则不保存空格。初始化的时候将keep_space设为false,这样开始阶段的空格都不会被保存,当碰到一个不为空格的字符是,保存该字符,然后设置keep_space=true表明会保存字符串中的第一个空格,这样在碰到第一个个空格时就能够保存。

在字符串结果,经过上述几步操作,可以保证字符串结尾要么是非空字符,要门是一个空字符,这样进行一次判断就好了,如果是空格字符,这将该空格设为'\0',如果不为空字符,则在其后面加上'\0'

3.2代码实例

View Code

 

 

 本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2012/05/08/2490033.html,如需转载请自行联系原作者

目录
相关文章
|
6月前
|
数据安全/隐私保护 C++ 索引
【一刷《剑指Offer》】面试题 4:替换空格
【一刷《剑指Offer》】面试题 4:替换空格
|
6月前
剑指Offre 面试题05. 替换空格
剑指Offre 面试题05. 替换空格
39 0
|
6月前
面试题05-替换空格(LeeCode)
面试题05-替换空格(LeeCode)
32 0
|
C++
剑指Offer - 面试题5:替换空格
剑指Offer - 面试题5:替换空格
66 0
|
PHP
PHP面试题:请以空格作为间隔,拆分字符串’Apple Orange Banana Strawberry’,组成数组$fruit,
PHP面试题:请以空格作为间隔,拆分字符串’Apple Orange Banana Strawberry’,组成数组$fruit,
132 0
|
存储 Java
剑指offer 面试题4—替换字符串中空格
题目: 实现一个函数,把字符串中的每个空格替换成“%20”。加入输入“we are happy.”,则输出“we%20are%20happy.”。 它想说的思想: 如果是字符数组来存储的话,每次扫描遇到空格都会导致后面的字符向后移动,然后为了节省这么多移动的时间,就先统计空格的个数,然后数组整体扩容空格数乘以3的空间,把那里当作结束,再从尾到头遍历,找到空格就移,这样整
1292 0
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
27天前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
59 2
|
1月前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
26 0