题目:
将字符串中的空格替换为“20%”
注:把需要替换的字符改为%xx,xx为要进行替换的字符的ASCII码的16进制表示。 替换字符串中的空格(空格的ASCII值为32,用16进制表示为20,所以将空格替换为%20)
思路:
第一步先遍历字符串,计算出替换空格之后的大小(由于一个字符被替换为了三个字符,所以替换后字符串的长度=空格的数量*2+替换之前字符串的长度)。定义两个指original_length和new_length, original_length指针指向原字符串的尾部,new_length指向替换后的尾部。
original_length开始从右向左移动:(替换字符时都从尾部开始遍历)
若没遇到空格,就将所指的字符复制到new_length所指的位置,然后new_length也向左移动一个字符;若遇到了空格,new_length分别赋值‘0’,‘2’,‘%’(每赋值完一个就左移一个)。
时间复杂度为 O(N)。
代码如下:
#include <iostream>
#include <cassert>
using namespace std;
void ReplaceBlank(char S[]){
assert(S!=NULL); //断言函数判断字符串不为空
int original_length=0;
int num_blank=0;
int i=0;
while(S[i]!='\0'){ //如果字符不为空,长度加一
original_length++;
if(S[i]==' '){
num_blank++; //如果字符为空格,空格数加一
}
i++;
}
int new_length=original_length+num_blank*2; //新字符串长度为原字符串长度加上空格数乘2
while(original_length>0&&new_length>original_length){
if(S[original_length]==' '){ //从后往前遍历
S[new_length]='0'; //替换之后指针需要向前移动一个
new_length--; //这里是先替换后移动,也可写成S[new_length--]='0';
S[new_length]='2';
new_length--;
S[new_length]='%';
new_length--;
}
else{
S[new_length]=S[original_length];
new_length--;
}
original_length--; //原字符串指针左移一个
}
}
int main(){
char S[30]="I like NEU ";
ReplaceBlank(S);
cout<<S;
return 0;
}