题目描述:

请实现一个函数,将一个字符串中的空格替换成“%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. python语法笔记(七)

    python标准库 Python有一套很有用的标准库(standard library).标准库会随着Python解释器,一起安装在你的电脑中的.它是Python的一个组成部分.这些标准库是Pytho ...

  2. phalcon: 获取参数的方法

    phalcon: 获取参数的方法 一般情况下:GET/POST $this->request->get(参数); $this->request->getPost("参 ...

  3. 微信JS SDK Demo 官方案例

    微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微信分享 ...

  4. 修复iPhone的safari浏览器上submit按钮圆角bug

    今天在公司写了一个登录页面效果,让我碰到一个怪异的问题——"表单中的input type=submit和input type=reset按钮在iPhone的safari浏览器下圆角有一个bu ...

  5. js,jquery判断某一节点是否存在

    前两天工作时遇到一问题,就是模块A显示时,B是一种样式,模块A删除,B是另一种样式.记录下判断节点存在的方法. 先写下html <!doctype html> <html> & ...

  6. python实现微信打飞机游戏

    环境:Ubuntu 16.04 LTS Python 2.7.11 +  Pygame + Pycharm 代码: # -*- coding: UTF-8 -*- import pygame, ran ...

  7. JavaScript实现五子棋的界面设计

    五子棋的界面设计包括绘制棋盘.绘制棋子及黑白棋轮流落子. 涉及的知识点主要有canvas绘制直线.设置画笔颜色:canvas画圆.填充渐变色 1.绘制棋盘 先设定棋盘的宽.高:然后利用for循环,根据 ...

  8. Visual Studio中的快捷键

    我们在使用Visual Studio的时候,如用一些快捷键,就能减少我们键盘和鼠标来回切换的次数,从而提高我们编码的速度,在此跟大家分享一些经常Visual Studio中用到的快捷键 自动缩进:选中 ...

  9. MD4C/CO46/MD04一个很棒的工单缺料分析

    大家好~~~ 之前在MD04物料分析的时候,看到有订单预留,双击有个订单报告可以显示一个订单物料是否缺料清单 这个单独的工单分析可以在T-code:MD4C,CO46查看,如果只是单独的使用,那么这两 ...

  10. lucene底层数据结构——底层filter bitset原理,时间序列数据压缩将同一时间数据压缩为一行

    如何联合索引查询? 所以给定查询过滤条件 age=18 的过程就是先从term index找到18在term dictionary的大概位置,然后再从term dictionary里精确地找到18这个 ...