剑指offer刷题—替换空格
2016-05-07 14:52
330 查看
一天一题的时间又到了,刚好是周六,让我们今天来好好分析一下下面这一道题:
面试题4:替换空格
请实现一个函数,把字符串中的每个空格替换成为“%20”.例如输入“We are happy”,则输出“We%20are%20happy”
首先对于这一道题,其实在网络编程中,是会用到的,我们常常将例如‘ ’这样的字符转换成其他可以识别的字符。转换规则是在‘%’后面跟上ASCII码的十六位进制的表示。
对于这一道题,我们要进行分析,按照常规的思路,首先你需要寻找空格,你需要把所替换空格后面的内容要全部移动,空出3个位置,把‘%’,‘2’,‘0’这三个字符插入进去。
在这,我们假设字符串的长度是n,对于每个空格字符,需要移动后面O(n)个字符,所以对于含有O(n)个空格字符的字符串而言总的时间的效率是O(n^2);
接下来,我们提供一种方式,作为效率更高的方法:
首先我们可以遍历一遍字符串,得到‘ ’的个数,并且得到字符串被替换以后的总长度。总长度实际上就是 原长度+空格数*2。然后,我们定义两个指针,一个指向原字符串末尾,另一个指向变化以后的字符串末尾。我们的字符串从替换后的长度位置开始,两个指针向前进行移动,当遇到 ‘ ’时,我们就依次把‘0’,‘2’‘%’放入就可以了,然后继续向前,继续替换前面的空格,直到我们把所有空格替换完毕,这时,我们就可以发现,没有空格以后,这两个指针会同时执行同一个位置了,所以这时,我们就可以结束了,所有的替换也就完成了。
通过上述说明,我们也就可以知道,所有的字符在这,也只移动了一次,所以时间复杂度为O(n),
面试题4:替换空格
请实现一个函数,把字符串中的每个空格替换成为“%20”.例如输入“We are happy”,则输出“We%20are%20happy”
首先对于这一道题,其实在网络编程中,是会用到的,我们常常将例如‘ ’这样的字符转换成其他可以识别的字符。转换规则是在‘%’后面跟上ASCII码的十六位进制的表示。
对于这一道题,我们要进行分析,按照常规的思路,首先你需要寻找空格,你需要把所替换空格后面的内容要全部移动,空出3个位置,把‘%’,‘2’,‘0’这三个字符插入进去。
在这,我们假设字符串的长度是n,对于每个空格字符,需要移动后面O(n)个字符,所以对于含有O(n)个空格字符的字符串而言总的时间的效率是O(n^2);
接下来,我们提供一种方式,作为效率更高的方法:
首先我们可以遍历一遍字符串,得到‘ ’的个数,并且得到字符串被替换以后的总长度。总长度实际上就是 原长度+空格数*2。然后,我们定义两个指针,一个指向原字符串末尾,另一个指向变化以后的字符串末尾。我们的字符串从替换后的长度位置开始,两个指针向前进行移动,当遇到 ‘ ’时,我们就依次把‘0’,‘2’‘%’放入就可以了,然后继续向前,继续替换前面的空格,直到我们把所有空格替换完毕,这时,我们就可以发现,没有空格以后,这两个指针会同时执行同一个位置了,所以这时,我们就可以结束了,所有的替换也就完成了。
通过上述说明,我们也就可以知道,所有的字符在这,也只移动了一次,所以时间复杂度为O(n),
#include<stdio.h> #include<stdlib.h> #include<string.h> void Replace(char arr[]) { int len = strlen(arr); int count = 0; char *p = arr; int old_end = len; int new_end = 0; while (*p) { if (*p == ' ') { count++; } p++; } new_end = len + 2 * count; while (old_end < new_end) { if (arr[old_end] == ' ') { old_end--; arr[new_end--] = '0'; arr[new_end--] = '2'; arr[new_end--] = '%'; } else { arr[new_end--] = arr[old_end--]; } } } int main() { char str[20] = "we are happy"; Replace(str); printf("%s\n", str); system("pause"); return 0; }
相关文章推荐
- jquery 扩展方法 hello world
- 移动前端开发:待处理
- 剑指offer 替换字符串中的空格
- js轮播图原理
- 关于纯css实现简单的下拉菜单
- jQuery环境搭建
- xshow-2. 使用HTML 5 Boilerplate构建前端
- css的继承性
- jQuerymobile 的页面跳转 原理
- 剑指offer(java版)
- 配置PHPSTORM前端开发环境
- JSF框架简介与实例
- javascript原型链简单示例(实现简单的继承)
- Css的优先级
- Css的优先级
- Css的优先级
- Css的优先级
- 前端学习总结(十)React——轻量而强大的构建用户界面的js库
- js得到文件后缀
- MySQL 性能优化之 延迟关联(deferred join)