🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
设计一种方法,将一个字符串中的所有空格替换成 %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); } ```