第三題:URL化
URL化。編寫一種方法翅睛,將字符串中的空格全部替換為%20。假定該字符串尾部有足夠的空間存放新增字符,并且知道字符串的“真實”長度宏所。(注:用Java實現的話酥艳,請使用字符數組實現,以便直接在數組上操作爬骤。)
示例1:
輸入:"Mr John Smith ", 13
輸出:"Mr%20John%20Smith"
示例2:
輸入:" ", 5
輸出:"%20%20%20%20%20"
提示:
字符串長度在[0, 500000]范圍內充石。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/string-to-url-lcci
著作權歸領扣網絡所有。商業(yè)轉載請聯系官方授權霞玄,非商業(yè)轉載請注明出處骤铃。
V1版本
這題主要是要將[空格]轉換成[%20],且知道字符的長度,且java需要用字符數組實現
v1解題思路
1坷剧,定義一個已知道長度的數組
2惰爬,依次獲取字符串中的字符,獲取到空格就在數組相應位置添加 [%20]惫企,否則將原字符添加到數組中
3撕瞧,將數組轉成string
代碼如下
public String replaceSpaces(String s, int length) {
String[] strArray = new String[length];
for (int i = 0; i < length; i++) {
if (' ' == s.charAt(i)) {
strArray[i] = "%20";
continue;
}
strArray[i] = String.valueOf(s.charAt(i));
}
StringBuilder sb = new StringBuilder(length);
for (String str : strArray) {
sb.append(str);
}
return sb.toString();
}
功能是簡單,性能可不夠看呀狞尔,其它完全不需要用到字符數組丛版,可這是硬性規(guī)定
V2
之前沒發(fā)現這句【假定該字符串尾部有足夠的空間存放新增字符】
開始擔心用char數組不知道長度,添加起來可能還需要擴容偏序,所以改用的string[],這下不用擔心了
代碼如下
public String replaceSpaces(String s, int length) {
char[] chars = new char[s.length()];
int j = 0;
for (int i = 0; i < length; i++) {
if (' ' == s.charAt(i)) {
chars[j++] = '%';
chars[j++] = '2';
chars[j++] = '0';
} else {
chars[j++] = s.charAt(i);
}
}
// 截取掉多余的空格
return String.valueOf(chars, 0, j);
}
快是快了許多页畦,但還只到78%
V3版本
看到評論區(qū)一有一個大佬的題解,原代碼如下
public String replaceSpaces(String S, int length) {
char[] chs = S.toCharArray();
int i = length-1, j = S.length()-1;
while(i>=0){
if(chs[i]==' '){
chs[j--] = '0';
chs[j--] = '2';
chs[j--] = '%';
}else{
chs[j--] = chs[i];
}
i--;
}
return String.valueOf(chs,j+1, S.length()-j-1);
}
這個寫法開始看的時候一直覺得會下標界或者是取到已賦值過的值研儒,debug了一個才發(fā)現這個寫法的精髓
用一個例子來解釋一下
假設入參為
"Mr John Smith ", 13
由于知道字符的長度豫缨,且原字符后面的空格數足夠,這樣讓程序直接在當前字符數組上進行修改端朵,不需要另外開劈空間好芭,且跳過了后面的空格部份,減少循環(huán)次數逸月,感覺這個解法才是最符合題意的栓撞,執(zhí)行如圖