剑指Offer--004-替换空格
2016-04-08 23:22
477 查看
链接
牛客OJ:替换空格九度OJ:http://ac.jobdu.com/problem.php?pid=1510
GitHub代码: 004-替换空格
CSDN题解:剑指Offer–004-替换空格
牛客OJ | 九度OJ | CSDN题解 | GitHub代码 |
---|---|---|---|
替换空格 | 1510-替换空格 | 剑指Offer–004-替换空格 | 004-替换空格 |
题意
题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。
例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
We Are Happy
We%20Are%20Happy
如果不考虑在原来的字符串上替换的话, 那么我们直接再开一个数组,从前往后依次赋值
遇见空格,就填上%20, 否则就填当前字符。
但是这个肯定不是面试官期待的
那么怎么在原字符串上进行高效的替换呢?
暴力替换
最原始的方法,我们遍历一遍字符串,对字符中每一个空格,都用%20来替换,由于用%20替换空格会导致字符串长度的增加,因此需要注意
* 从后往前遍历字符串
* 每找到一个空格,需要将
' '后面的字符串依次后移两位,预留出%20的空间
代码如下
#include <iostream> using namespace std; #define __tmain main class Solution { public: void replaceSpace(char *str,int length) { int i = length - 1, j; int len = length; // 从后往前遍历 for(i = length - 1; i >= 0; i--) { //cout <<str[i] <<endl; // 如果当前字符是空格 if(str[i] == ' ') { // 从空格变成%20长度增加了2 len += 2; for(j = len - 1; j > i + 2; j--) { str[j] = str[j - 2]; } str[j--] = '0'; str[j--] = '2'; str[j--] = '\%'; } //cout <<str <<endl; } str[len] = '\0'; } }; int __tmain( ) { char str[10 + 1] = "a b c d"; Solution solu; solu.replaceSpace(str, 10); cout <<str <<endl; return 0; }
优化
上面那个方法太暴力了,有没有什么更好的方法呢?我们的代码,主要消耗的时间在于,如果有多个空格, 那么每遇到一个空格就进行移位
其实前面的移位是没必要的,因为如果再遇到空格,那么之前的移位全是无用功
因此我们可以考虑先遍历一遍字符串, 计数空格的数目,
我们知道了空格的数目,其实就是知道了替换后字符串的长度,那么只需要进行一次替换就可以了
因为我们的工作变为
遍历一遍字符串, 统计字符出现的数目, 计算替换后的字符串长度
再遍历一遍字符串,完成替换
代码如下
#include <iostream> using namespace std; #define __tmain main class Solution { public: void replaceSpace(char *str,int length) { int i, j; int count = 0; int len = length; for(int i = 0; i < length; i++) { if(str[i] == ' ') { count++; } } len = length + count * 2; for(i = length - 1, j = len - 1; i >= 0 && j >= 0;) { if(str[i] == ' ') { str[j--] = '0'; str[j--] = '2'; str[j--] = '%'; i--; } else { str[j--] = str[i--]; } } str[len] = '0'; } }; int __tmain( ) { char str[10 + 1] = "a b c d"; Solution solu; solu.replaceSpace(str, 10); cout <<str <<endl; return 0; }
相关文章推荐
- 查看github pages文档的方式
- 使用BAE的基于Web.py的简单博客程序
- 数据库链接字符串查询网站
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Flex字符串比较 还有Flex字符串操作
- Ruby实现的矩阵连乘算法
- Ruby中创建字符串的一些技巧小结
- ASP下经常用的字符串等函数参考资料
- 将字符串小写转大写并延时输出的批处理代码
- 将字符串转换成System.Drawing.Color类型的方法
- C#插入法排序算法实例分析
- 如何高效的使用内存
- Lua源码中字符串类型的实现
- Lua性能优化技巧(四):关于字符串
- 字符串聚合函数(去除重复值)
- Ruby中的字符串编写示例