剑指offer面试题4:一个字符串中的空格 替换为%20
一般解法:如果一个一个的遍历,碰到空格就把它换为%20,那么后面的所有元素都要移动两个位的距离,时间复杂度O(N2)
O(n) 解法:遍历一遍字符串,得出空格的个数,这样 就得到替换后的新的字符串长度NewLength。那么首先我们准备两个指针,第一个p1指向字符串的末尾,另一个p2指向被替换后的字符串的末尾,这样p1,p2同时向前移动,如果p1指向的值不为空格,则直接复制到p2所指向的位置,如果碰见空格,则把空格替换为%20,然后复制的p2所指的位置,然后p2向前多一动两步。
//字符串空格替换为%20
void ReplaceString(char *str,int length){
//判断字符串是否为空,或长度小于0
if(NULL==str||length<=0)
return;
else{
int originalLength=0;//实际长度
int NewLength=0;//替换后的长度
int i=0,j=0;
while(str[i]!='\0'){
++originalLength;
if(str[i]==' ')
++j;
++i;
}
NewLength=originalLength+j*2;
while(originalLength>0||NewLength>originalLength){
if(str[originalLength]==' '){
str[NewLength--]='0';
str[NewLength--]='2';
str[NewLength--]='%';
}
else{
str[NewLength--]=str[originalLength];
}
--originalLength;
}
}
}