题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
规律发现
问题1:替换字符串,是在原来的字符串上做替换,还是开辟一个新字符串做替换;
问题2:怎么替换更有效?从前往后替换,后面的字符串要不断往后挪动,效率低下;
应该从后往前替换,首先计算替换前字符串的长度usedLength,然后通过一重循环,计算出该字符串中的空格数目whiteCount,每一个空格,替换后比替换前长度增加2,即:targetLength=2*whiteCount + usedLength。
随后,从字符串的最后一位开始,从后向前,判断,当前位置是否是空格,如果是空格,就把字符串当前位置的值赋给对应的目标位置,同时usedLength–,如果不是空格,只需要向后移动字符即可。
完整代码展示
public class N2替换空格 {
public static int replaceBlank(char [] string ,int usedLength){
//判断输入是否合法
if(string == null || string.length < usedLength){
return -1;
}
//统计字符数组中的空白字符数目
int whiteCount = 0;
for(int i = 0 ; i < string.length ; i++){
if(string[i] == ' ')
whiteCount += 1;
}
//计算替换后的字符长度是多少
int targetLength = whiteCount*2 + usedLength;
int tmp = targetLength;
if(targetLength > string.length) //越界处理,如果替换后的长度超过了数组长度,返回-1
return -1;
//没有字符串,不处理
if(whiteCount == 0)
return usedLength;
usedLength--;
targetLength--;
//替换处理
while(usedLength >= 0 && usedLength < targetLength){
//如果当前字符是空格,进行%20替换
if(string[usedLength] == ' '){
string[targetLength--] = '0';
string[targetLength--] = '2';
string[targetLength--] = '%';
}else{
string[targetLength--] = string[usedLength];
}
usedLength--;
}
return tmp;
}
public static void main(String[] args){
char[] string = new char[50];
string[0] = 'w';
string[1] = 'e';
string[2] = ' ';
string[3] = 'a';
string[4] = 'r';
string[5] = 'e';
string[6] = ' ';
string[7] = 'f';
string[8] = 'a';
string[9] = 'm';
string[10] = 'i';
string[11] = 'l';
string[12] = 'a';
string[13] = 'y';
int length = replaceBlank(string,14);
System.out.println(new String(string,0,length));
}
}
运行结果显示
计划任务
- 完成任务