设计一种方法,将一个字符串中的所有空格替换成 %20 。你可以假设该字符串有足够的空间来加入新的字符,且你得到的是“真实的”字符长度。
你的程序还需要返回被替换后的字符串的长度。
对于字符串"Mr John Smith", 长度为 13
替换空格之后,参数中的字符串需要变为"Mr%20John%20Smith",并且把新长度 17 作为结果返回。
**规则**
输入:char[] 和int length
输出:int 最新长度,从char[]取字符串
case:
```
数组为null
数组长度为0
"we are happy"
"we are "
"we are " --连续多个空格
" we are "
" we"
"we "
" we "
```
**思路**
1.创建一个新数组,然后一个拷贝过去,遇到空格替换为%20 复杂度为O(n)和O(n)
2.不创建新数组,创建新数组,遇到空格向后移动,复杂度为O(n^2)和O(1)
3.不创建新数组,先遍历一遍,计算空格数量,然后两个指针,从后向前拷贝,这样复杂度为O(n)和O(1)
**代码**
```
public int replaceBlank(char string[], int length) {
if(string == null) {
return 0;
}
if(length == 0) {
return 0;
}
int newLength = length;
for(int i = 0;i < length;i++) {
if(string[i] ==' ') {
newLength += 2;
}
}
if(newLength == length ) return length;
int p = length-1,q = newLength-1;
while(p>=0) {
if(string[p] == ' ') {
string [q--] = '0';
string [q--] = '2';
string [q--] = '%';
}else {
string[q--] = string[p];
}
p--;
}
return newLength;
}
```
测试代码
```
public char[] fill(String cnt) {
char ret[] = new char[100];
char c[] = cnt.toarArray();
System.arraycopy(c, 0, ret, 0, c.length);
return ret;
}
public void assertString(String str) {
String str1 = str.replaceAll(" ","%20");
String str2 = replace(fill(str), str.length());
assertEquals(str1,str2);
}
public String replace(char arr[] ,int len) {
StringBlank1 m1 = new StringBlank1();
int newLen = m1.replaceBlank(arr, len);
if(arr == null) {
arr = new char[1];
}
return String.valueOf(arr, 0, newLen);
}
```