题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:
解法一:调用自带函数str.toString().replace(" ","%20")。
解法二:在当前字符串上进行替换。
- 先计算替换后的字符串需要多大的空间,并对原字符串空间进行扩容;
- 从后往前替换字符串的话,所有的字符都只复制(移动)一次,时间复杂度是O(n);
- 如果从前往后替换,每个字符串需要多次移动,效率较低。
解法三:开辟一个新的字符串。当遇到 " ",就追加 "%20",否则遇到什么追加什么。
总结: 在合并两个数组(包括字符串)时,如果从前往后复制每个数字(或字符)则需要重复移动数字(或字符)多次,那么可以考虑从后往前复制,这样就能减少移动的次数,从而提高效率。
解法一
public class Solution { public String replaceSpace(StringBuffer str) { return str.toString().replace(" ","%20"); } }
解法二
public class Solution { public String replaceSpace(StringBuffer str) { //originalLength为字符串的实际长度 int originalLength = str.length(); int spaceNum = 0; for (int i = 0; i < str.length(); i++){ if (str.charAt(i) == ' '){ spaceNum++; } } //newLength为把空格替换成'%20'之后的长度 int newLength = originalLength + spaceNum * 2; str.setLength(newLength); //对StringBuffer扩容!! int indexOfOriginal = originalLength - 1; int indexOfNew = newLength - 1; while (indexOfOriginal >= 0 && indexOfNew > indexOfOriginal){ if (str.charAt(indexOfOriginal) == ' '){ str.setCharAt(indexOfNew--, '0'); //注意setCharAt与insert的区别,insert对该位置及之后的元素向后平移,然后插入新元素。 str.setCharAt(indexOfNew--, '2'); str.setCharAt(indexOfNew--, '%'); }else{ str.setCharAt(indexOfNew--,str.charAt(indexOfOriginal)); } indexOfOriginal --; } return str.toString(); } }
解法三
public class Solution { public String replaceSpace(StringBuffer str) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < str.length(); i++){ if (str.charAt(i) == ' '){ sb.append("%20"); }else{ sb.append(str.charAt(i)); } } return sb.toString(); } }
知识点扩展——StringBuffer常用方法
public class StringBufferBuilderTest { public static void main(String[] args) { StringBuffer sf=new StringBuffer(); // 用于字符串拼接 sf.append("ab"); sf.append(25); System.out.println(sf); // 删除指定位置的内容 [start,end) sf.delete(4,6); System.out.println(sf); // 把[start,end)位置替换为str sf.replace(1,3,"we"); System.out.println(sf); // 在指定位置插入数据 sf.insert(2,"xxx"); System.out.println(sf); // 截取[start,end)字符串 System.out.println(sf.substring(1,5)); // 返回字符串长度 System.out.println(sf.length()); // 获取索引为1的字符 System.out.println(sf.charAt(1)); // 将索引为1处的值替换为'm' sf.setCharAt(1,'m'); System.out.println(sf); // 将字符串翻转 System.out.println(sf.reverse()); } }