我们都遇到过的 Replace Blank Space
题目描述:
请实现一个函数,将一个字符串中的空格替换成“%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的更多相关文章
- [转]ConsumeContainerWhitespace property to remove blank space in SSRS 2008 report
转自:http://beyondrelational.com/modules/2/blogs/115/posts/11153/consumecontainerwhitespace-property-t ...
- Replace 删除、替换函数精解示例
'************************************************************************* '**模 块 名:Replace函数精解示例 '* ...
- js中的replace全局替换
比如想把str中的所有“&”替换成“&” replace (\&\,"&");只是替换第一个,那么怎么全部都替换呢? replace(new Reg ...
- CUBRID学习笔记 45 REPLACE DELETE MERGE 教程
c#,net,cubrid,教程,学习,笔记欢迎转载 ,转载时请保留作者信息.本文版权归本人所有,如有任何问题,请与我联系wang2650@sohu.com . 过错 ------ 官方文档是英文的, ...
- Solr相似度名词:VSM(Vector Space Model)向量空间模型
最近想学习下Lucene ,以前运行的Demo就感觉很神奇,什么原理呢,尤其是查找相似度最高的.最优的结果.索性就直接跳到这个问题看,很多资料都提到了VSM(Vector Space Model)即向 ...
- 转:Lucene之计算相似度模型VSM(Vector Space Model) : tf-idf与交叉熵关系,cos余弦相似度
原文:http://blog.csdn.net/zhangbinfly/article/details/7734118 最近想学习下Lucene ,以前运行的Demo就感觉很神奇,什么原理呢,尤其是查 ...
- [:space:]的用法(转)
转自:http://blog.itpub.net/27181165/viewspace-1061688/ 在linux中通常会使用shell结合正则表达式来过滤字符,本文将以一个简单的例子来说明+,* ...
- canvas保存为data:image扩展功能的实现
[已知]canvas提供了toDataURL的接口,可以方便的将canvas画布转化成base64编码的image.目前支持的最好的是png格式,jpeg格式的现代浏览器基本也支持,但是支持的不是很好 ...
- ocp 1Z0-047 131-276题解析
131. Which view would you use to display the column names and DEFAULT valuesfor a table?A. DBA_TABLE ...
随机推荐
- 如何部署Scrapy 到Scrapyd上?
安装上传工具 1.上传工具 scrapyd-client 2.安装方法: pip install scrapyd-client 3.上传方法: python d:\Python27\Scripts\s ...
- 2016-6-15-de novo文献阅读
准备读四篇denovo的文献: Nature Biotechnology(2015) - Sequencing of allotetraploid cotton (Gossypium hirsutum ...
- PhoneGap插件开发流程
前几天写了一个PhoneGap插件,这个插件的功能很简单,就是开启viewport设置.不过与其它插件相比,有好几个有意思的地方,仔细读了PhoneGap的源码才搞定.这里记录一下PhoneGap插件 ...
- as(C# 参考)
原文地址:https://msdn.microsoft.com/zh-cn/library/cscsdfbt(v=vs.110).aspx 可以使用 as 运算符执行转换的某些类型在兼容之间的引用类型 ...
- gulp-webpack工程化实现electron
参考网站: https://www.npmjs.com/package/babel-loader https://www.npmjs.com/package/gulp https://www.npmj ...
- Tomcat卸载
1.以管理员身份打开cmd,执行以下命令: C:Windows\system32>cd C:\Program Files\apache-tomcat-7.0.69\bin C:\Program ...
- 重装系统(win7)
-_-|| 第一次装,可谓艰难险阻 一:准备 1.U盘(大小至少4G)——本人用了4G的 2.查询自己的电脑进入BIOS的方法——本人电脑机型为华硕X550VC,开机长按F2(当时为保险起见,也同时按 ...
- 关于 iOS 批量打包的总结
关于 iOS 批量打包的总结 本文作者: 伯乐在线 - Tsui YuenHong .未经作者许可,禁止转载!欢迎加入伯乐在线 专栏作者. 如果你曾经试过做多 target 的项目,到了测试人员要 ...
- Entity Framework 复杂类型
为了说明什么是复杂属性,先举一个例子. public class CompanyAddress { public int ID { get; set; } public string Compan ...
- TreeList用法(1)
本人按照网上搜的一些小用法整理的: 如果要出现左边的效果,代码如下: public DataTable CreateDataTable() { DataTable ...