題目:請實現一個函數,把字符串中的每個空格替換成"%20"。
例如,輸入"We are happy.",則輸出"We%20are%20happy."。
此題看似簡單,實則坑還是比較多的。
替換字符的長度有變化,由空格‘ ’一個字符變成”%20“三個字符,這樣勢必會造成原字符串長度變長,這樣就要考慮字符數組長度是否夠用(當然java中String字符串的變更都是創建新的字符串常量,此處字符串視為字符數組。)
除了數組長度會發生變化,這其中還涉及到一個字符替換成三個字符后,原位置字符的移動問題(不移動會造成替換字符覆蓋原字符問題),為避免同一字符多次移動的操作(O(n^2)),這里可以采用從后向前替換的操作(O(n))。
當然如果空間允許的情況下,重新創建一個字符串來得更快(顯然這樣會和offer擦肩而過...)。
taking is cheaper,show the code.
/**
* 〈面試題5:請實現一個函數,把字符串中的每個空格替換成"%20"。
* 例如,輸入"We are happy.",則輸出"We%20are%20happy."。〉
*
* @author caozx
* @date 2020/1/16 17:47
*/
public class Question05 {
/**
* 方式一:開辟新空間
*/
public String replaceBlank1(String s) {
if (s == null) {
return null;
}
StringBuilder stringBuilder = new StringBuilder();
// 遍歷字符串, 復制每個字符, 當遇到空格時, 就增加替換字符。
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == ' ') {
stringBuilder.append("%20");
} else {
stringBuilder.append(c);
}
}
return stringBuilder.toString();
}
/**
* 方式二:從后往前復制
*/
public String replaceBlank2(String s) {
if (s == null) {
return null;
}
StringBuilder stringBuilder = new StringBuilder(s);
// 記錄空格數
int blankNum = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ' ') {
blankNum++;
}
}
int sEndIndex = s.length() - 1;
int newStringEndIndex = s.length() - 1 + 2 * blankNum;
stringBuilder.setLength(newStringEndIndex + 1);
while (sEndIndex < newStringEndIndex) {
if (s.charAt(sEndIndex) == ' ') {
stringBuilder.setCharAt(newStringEndIndex--, '0');
stringBuilder.setCharAt(newStringEndIndex--, '2');
stringBuilder.setCharAt(newStringEndIndex--, '%');
} else {
stringBuilder.setCharAt(newStringEndIndex--, s.charAt(sEndIndex));
}
sEndIndex--;
}
return String.valueOf(stringBuilder);
}
}
測試:
public class Quention05Test {
public static void main(String[] args) {
String s = "helle world, my name is caozx.";
String s1 = "helleworld.";
Question05 question05 = new Question05();
System.out.println(question05.replaceBlank1(s));
System.out.println(question05.replaceBlank1(null));
System.out.println(question05.replaceBlank1(s1));
System.out.println(question05.replaceBlank2(s));
System.out.println(question05.replaceBlank2(null));
System.out.println(question05.replaceBlank2(s1));
}
}