题目描述:

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

分析:
  看到这个题目,我们都会有一个比较直观的加法,那就是遍历字符串,每当遇到空格,就在当前位置插入“%20”,当前位置的字符往后移动三个位置。接着继续遍历,直到字符串结束。这个解法简单容易理解,但是直观的解法往往是效率比较低的,不难看出这个算法的时间复杂度是O(n^2).
  
  那么接下来就来看一下时间复杂度为O(n)的算法。不难看出无论什么算法都得遍历一遍整个字符串,那么既然从前往后遍历字符串效率低,那么我们就从后面往前遍历又会如何呢?这个算法需要两次遍历字符串。第一次从前往后遍历字符串,统计字符串中空格的次数。然后计算出把空格替换成“%20”后的字符串长度。然后就进行第二次遍历字符串,准备两个指针p1、p2,p1指向替换前字符串的末尾,p2指向替换后字符串的末尾,然后往前开始遍历数组,逐个把p1指向的字符复制到p2指向的地址。当遇到p1遇到空格时,p1向前移动一步,在p2前面插入三个字符“%20”,p2向前移动三步,接着又开始一步一步往前遍历替换,遇到空格时执行前面同样的操作。直到遍历结束。
  
  如果我说得不是很清楚,请看实现代码吧!

C++实现:

 class ReplaceBlankSpace {
public:
void replaceSpace(char *str,int length) {
int spaceNum = ;
int origin = length - ;
int end = ;
for (int i = ; i < length; i++)
{
if (str[i] == ' ')
{
spaceNum++;
}
} int afterLength = length + spaceNum * - ;
end = afterLength;
for (int i = length - ; i >= ; i -- )
{
if (str[i] == ' ')
{
str[afterLength] = '';
str[afterLength -] = '';
str[afterLength -] = '%';
afterLength -= ;
}
else
{
str[afterLength] = str[i];
afterLength --;
}
} }
};

总结:

  直观的算法之所以效率低,是因为需要多次重复移动空格后面的字符。而第二种算法从后面遍历字符串就避免的多次重复移动字符,所有字符串都只复制移动了一次,所以时间复杂度是O(n),从而提高了效率。

  以此类推,如果我们遇到的的算法题,从前往后遍历需要多次重复复制移动元素,那么久可以考虑一下,是否可以从后往前遍历,减少复制移动的次数,从而提高效率。

我们都遇到过的 Replace Blank Space的更多相关文章

  1. [转]ConsumeContainerWhitespace property to remove blank space in SSRS 2008 report

    转自:http://beyondrelational.com/modules/2/blogs/115/posts/11153/consumecontainerwhitespace-property-t ...

  2. Replace 删除、替换函数精解示例

    '************************************************************************* '**模 块 名:Replace函数精解示例 '* ...

  3. js中的replace全局替换

    比如想把str中的所有“&”替换成“&” replace (\&\,"&");只是替换第一个,那么怎么全部都替换呢? replace(new Reg ...

  4. CUBRID学习笔记 45 REPLACE DELETE MERGE 教程

    c#,net,cubrid,教程,学习,笔记欢迎转载 ,转载时请保留作者信息.本文版权归本人所有,如有任何问题,请与我联系wang2650@sohu.com . 过错 ------ 官方文档是英文的, ...

  5. Solr相似度名词:VSM(Vector Space Model)向量空间模型

    最近想学习下Lucene ,以前运行的Demo就感觉很神奇,什么原理呢,尤其是查找相似度最高的.最优的结果.索性就直接跳到这个问题看,很多资料都提到了VSM(Vector Space Model)即向 ...

  6. 转:Lucene之计算相似度模型VSM(Vector Space Model) : tf-idf与交叉熵关系,cos余弦相似度

    原文:http://blog.csdn.net/zhangbinfly/article/details/7734118 最近想学习下Lucene ,以前运行的Demo就感觉很神奇,什么原理呢,尤其是查 ...

  7. [:space:]的用法(转)

    转自:http://blog.itpub.net/27181165/viewspace-1061688/ 在linux中通常会使用shell结合正则表达式来过滤字符,本文将以一个简单的例子来说明+,* ...

  8. canvas保存为data:image扩展功能的实现

    [已知]canvas提供了toDataURL的接口,可以方便的将canvas画布转化成base64编码的image.目前支持的最好的是png格式,jpeg格式的现代浏览器基本也支持,但是支持的不是很好 ...

  9. ocp 1Z0-047 131-276题解析

    131. Which view would you use to display the column names and DEFAULT valuesfor a table?A. DBA_TABLE ...

随机推荐

  1. hiho_1068_RMQ_st算法

    题目 给出一数组A,编号从1到n,然后进行q次查询,每次查询给出一个边界[beg, end],要求给出数组A中范围[beg, end]之内的最小值. 题目链接: RMQ_ST 分析 区间问题使用线段树 ...

  2. JavaScript设计模式与开发实践 - 策略模式

    引言 本文摘自<JavaScript设计模式与开发实践> 在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但 ...

  3. spring源码深度解析-1核心实现

    xml配置文件的读取:1:通过集成字AbstractBeanDefinitionReader中的方法,来使用ResourceLoader将资源文件路径转换为对应的Resource文件2:通过Docum ...

  4. shell中for循环

    shell中for循环总结 最常用的就是遍历操作某一类文件,比如批量建索引. for i in `ls` do samtools faidx $i done 注意:for末尾不需要冒号(:),循环的代 ...

  5. python的模式匹配 - 正则表达式

    之前学过perl,深知perl在模式匹配方面的强大,现在想完全转到python,虽说python的模式匹配没有perl那么强大,但还是可以用的,只是需要一个熟悉的过程. 参考资料: Python正则表 ...

  6. XPath的语法

    XPath 是XML的查询语言,和SQL的角色很类似.以下面XML为例,介绍XPath 的语法. <?xml version="1.0" encoding="ISO ...

  7. 《Java程序设计》第五周学习总结

    20145224 <Java程序设计>第五周学习总结 教材学习内容总结 第八章异常处理 8.1.1使用try.catch ·教材范例用户连续输入整数,输入0结束后显示输入数的平均值(代码如 ...

  8. Java GC系列(3):垃圾回收器种类

    本文由 ImportNew - 好好先生 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 在这篇教程中我们将学习几种现有的垃圾回收器.在 ...

  9. hdu---(3555)Bomb(数位dp(入门))

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submi ...

  10. Login 页面

    1.jsp <script type="text/javascript"> function doLogin() { if (trim($('#username').v ...