【剑指offer】-2-替换空格
替换空格
https://www.nowcoder.com/practice/4060ac7e3e404ad1a894ef3e17650423?tpId=13&&tqId=11155&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
1. 用Java自带的函数str.toString().replace(" ","%20")
public class Solution { public String replaceSpace(StringBuffer str) { return str.toString().replace(" ", "%20"); } }
2. 开辟一个新的字符串
当遇到 " ",就追加 "%20",否则遇到什么追加(append)什么
import java.util.*; public class Solution { public String replaceSpace(StringBuffer str) { StringBuilder sb = new StringBuilder(); for(int i=0;i<str.length();i++){ char c = str.charAt(i); if(c == ' '){ sb.append("%20"); }else{ sb.append(c); } } return sb.toString(); } }
3. 在当前字符串上进行替换
先计算替换后的字符串需要多大的空间,并对原字符串空间进行扩容;
从后往前替换字符串的话,每个字符串只需要移动一次;
如果从前往后,每个字符串需要多次移动,效率较低
从后往前如下:public class Solution { public String replaceSpace(StringBuffer str) { int spaceNum = 0; for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == ' ') spaceNum++; } int oldLength = str.length(); int oldIndex = oldLength - 1; str.setLength(oldLength + spaceNum * 2); int newLength = str.length(); int newIndex = newLength - 1; for (; oldIndex >= 0; oldIndex--) { if (str.charAt(oldIndex) == ' ') { str.setCharAt(newIndex--, '0'); str.setCharAt(newIndex--, '2'); str.setCharAt(newIndex--, '%'); } else { str.setCharAt(newIndex--, str.charAt(oldIndex)); } } return str.toString(); } }