您的位置:首页 > Web前端

剑指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)='%';
}
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: