剑指Offer:替换空格
2016-08-02 09:13
417 查看
替换空格
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。显然从后往前是最佳C语言式解法,这个纯粹的指针运算。记住在往后迁移后,写入替换字符一定要记住加上偏移距离。
//length为牛客系统规定字符串输出的最大长度,固定为一个常数 class Solution { public: void replaceSpace(char *str,int length) { int count=0,len=0; char *cur=str; for(;*cur!='\0';++cur,++len){ if(*cur==' ') ++count; } if(3*count+len>length) return; int i=len+1; while(count&&i>=0){ int move=2*count; for(;*(str+i)!=' '&&i>=0;--i){ *(str+i+move)=*(str+i); } *(str+i+move-2)='%';//move表示移动距离!! *(str+i+move-1)='2'; *(str+i+move)='0'; --i; --count; } } };
我认为只要题目没有要求,我们可以尽量使用字符串函数。比如java中替换。如@RX的代码。注意其中反斜线的转义。再比如c++中算法:replace(iList.begin(),iList.end(),0,42);表示将迭代器范围内0替换为42;若要保持长度不变可以采用replace_copy(iList.begin(),iList.end(),back_inserter(ivec),0,42)。
public class Solution { public String replaceSpace(StringBuffer str) { return str.toString().replaceAll("\\s", "%20"); } }
2016.9.8更新
参考了书里的代码,发现两个指针写出来比起一个指针写出来要清晰很多。还有应该是+2*count。
//length为牛客系统规定字符串输出的最大长度,固定为一个常数 class Solution { public: void replaceSpace(char *str,int length) { if(!str||length<=0) return; int count{0},len{0}; for(char *p=str;*p!='\0';++p,++len){ if(*p==' ') ++count; } if(len+2*count>length) return; //两个指针,一个扫描一个指向待写区。注意此处是+2*count for(char *behind=str+len+2*count,*cur=str+len; cur!=behind;--cur,--behind){ //结束条件不能是cur!=str,防止第一个字符为空格,同时对于其他情况可以减少循环 if(*cur!=' '){ *behind=*cur; } else{ *(behind--)='0'; *(behind--)='2'; *(behind)='%'; } } } };
相关文章推荐
- jquery的layer弹出层框架,如果设置 iframe弹出一个页面里是表单提交,提交完怎么关闭弹出层
- AngularJS基础 ng-init 指令简单示例
- js事件总结
- 前端知识概述
- jQuery源码研究分析学习笔记-jQuery.fn.init()(五)
- 02、CSS3结构选择器
- js语法规范
- 剑指Offer:二维数组中的查找
- JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
- HTML特殊字符编码大全
- XML 格式转JSON 格式
- 从零学React Native之03页面导航
- 从零学React Native之03页面导航
- [JQ权威指南]JQuery操作XML数据
- 基于Vue.js实现数字拼图游戏
- 从零学React Native之02状态机
- 从零学React Native之02状态机
- javascript中继承后为什么要修正constractor
- js 获取范围内的随机数实例代码
- libevent的evbuffer跟bufferevent的区别