TIPS:‘%20’有三个字符构成,遍历直接替换的话需要增加字符串的空间,然后进行移位和替换,因此,先计算空格数目,直接算好替换后需要空间,然后从尾部开始遍历。
算法流程:
1 遍历字符串,记录下有多少个空格;
2 从字符串尾部重新解析:
(1) 如果当前字符为空格,在写入字符串'%20'
(2) 非空格则直接记录。
/*
* length为字符数组的容量
*/
private static void replaceBlank(char[] string, int length) {
if (string==null||length==0) {
return;
}
//originalLength为字符的总长度
int originalLength=0;
int blankLength=0,index=0;//空格的个数
while (string[index]!=' ') {
originalLength++;
if (string[index]==' ') {
blankLength++;
}
++index;
}
//替换后的长度
int newLength=originalLength+blankLength*2;
if (newLength>length) {
return;
}
//从后往前,依次复制原始串中字符,并将空格替换为"20%"
int indexOfNew=newLength;
int indexOfOriginal=originalLength;
while (indexOfOriginal>=0&&indexOfNew>indexOfOriginal) {
if (string[indexOfOriginal]==' ') {
string[indexOfOriginal--]='0';
string[indexOfOriginal--]='2';
string[indexOfOriginal--]='%';
}
else {
string[indexOfNew--]=string[indexOfOriginal];
}
indexOfOriginal--;
}
}