剑指offer面试题:替换空格(将字符串每个空格替换为%20)
2016-06-15 21:41
393 查看
题目:请实现一个函数,把字符串的每个空格替换成“%20”。例如:输入:“we are happy.”,则输出:“we%20are%20happy.”
这里考虑的是在原来的字符串上做替换这一种情况:
若我们用直接做法从头到尾扫描字符串,每碰到一个空格就做替换,其空格后面的字符都必须后移两个字节,如图:
浅黄色背景代表需要移动的字符,紫色背景代表需要移动两次的字符,因此,若这样做,有O(n)个空格的话总时间效率为O(n^2),所以我们要寻找一种更快的方法,那就是把从前向后替换改成从后向前替换。
如图过程:
先遍历一次字符串,统计空格数目,然后计算出替换后字符串总长度,然后设两个指针p1,p2, p1指向原字符串末尾,p2指向替换之后字符串末尾,向前移动p1,逐个将其指向的字符复制到p2指向的空间,若遇到空格,p1向前移动1位,在p2之前插入“%20”,在将p2向前移动3位。具体代码实现:
这里考虑的是在原来的字符串上做替换这一种情况:
若我们用直接做法从头到尾扫描字符串,每碰到一个空格就做替换,其空格后面的字符都必须后移两个字节,如图:
浅黄色背景代表需要移动的字符,紫色背景代表需要移动两次的字符,因此,若这样做,有O(n)个空格的话总时间效率为O(n^2),所以我们要寻找一种更快的方法,那就是把从前向后替换改成从后向前替换。
如图过程:
先遍历一次字符串,统计空格数目,然后计算出替换后字符串总长度,然后设两个指针p1,p2, p1指向原字符串末尾,p2指向替换之后字符串末尾,向前移动p1,逐个将其指向的字符复制到p2指向的空间,若遇到空格,p1向前移动1位,在p2之前插入“%20”,在将p2向前移动3位。具体代码实现:
#include <stdio.h> #include <stdlib.h> #include <string.h> void ReplaceBlack(char str[],int lenth)//lenth为字符数组总长度 { int numblack=0; char *ptr=str; int oldlenth=strlen(str);//字符数组原实际长度 int newlenth=0; if(str==NULL&&lenth<=0) { return; } while(*ptr)//统计空格数量 { if(*ptr==' ') { numblack++; } ptr++; } if(numblack==0) { return; } newlenth=oldlenth+2*numblack;//字符数组替换后新长度 if(newlenth>lenth) { return; } while(oldlenth<newlenth) { if(str[oldlenth]!=' ')//依次复制字符串内容 { str[newlenth--]=str[oldlenth--]; } else//空格替换 { oldlenth--; str[newlenth--]='0'; str[newlenth--]='2'; str[newlenth--]='%'; } } } int main() { char str[30]="we are happy."; ReplaceBlack(str,30); printf("%s\n",str); system("pause"); return 0; }
相关文章推荐
- 你离升职加薪只差一个沟通的距离
- c#面试题
- 我的2013-从GIS学生到GIS职业人的飞跃
- IOS 面试可能会问到的知识点
- 程序员的成长和代码行数的关系
- 一道SQL面试题(行列互换)
- [置顶] Java面试题全集(下)
- 面试心得
- [置顶] Java面试题全集(中)
- Java面试题全集(上)
- 2016/6/15 面试
- 乐死我了,怎么样成为一个全栈程序员(Full Stack Developer)
- java面试基础知识
- 中日程序员的千秋
- 重新做人的迷失程序员
- iOS 面试题汇总
- 奋斗吧,程序员——第五十五章 不才明主弃,多病故人疏
- 面试题35 第一个只出现一次的数组
- 剑指offer---面试题7 用两个栈实现队列
- 面试题31 连续子数组的最大和