题目描述:
编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)
示例 1:
输入:"Mr John Smith", 13
输出:"Mr%20John%20Smith"
示例 2:
输入:" ", 5
输出:"%20%20%20%20%20"
提示:
字符串长度在 [0, 500000] 范围内。
题解:
方法一:创建额外数组
思路:
1)创建字符数组,最大长度为字符串长度的3倍(字符串中所有字符都是空格,都需要替换)。
2)遍历字符串中的每个字符,判断该字符是否是空格:
- 该字符是空格,将'%' '2' '0'三个字符依次添加到字符数组。
- 该字符不是空格,将该字符添加到字符数组。
3)将字符数组转换为字符串并返回。
代码:
public String replaceSpaces(String S, int length) {
char[] newCharArray = new char[length*3];
int size = 0;
for(int i = 0;i < length;i++){
if(S.charAt(i) == ' '){
newCharArray[size++] = '%';
newCharArray[size++] = '2';
newCharArray[size++] = '0';
}else {
newCharArray[size++] = S.charAt(i);
}
}
return new String(newCharArray, 0, size);
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(n)
方法二:原地倒序填充
思路:
1)将字符串转换为字符数组。
2)倒序遍历字符数组,判断每个字符是否是空格:
- 该字符是空格,将'0' '2' '%'三个字符依次添加到字符数组后面。
- 该字符不是空格,将该字符添加到字符数组。
3)从字符数组中截取有效部分转换为字符串并返回。
代码:
public String replaceSpaces(String S, int length) {
char[] charArray = S.toCharArray();
int n = S.length();
int j = n - 1;
for(int i = length - 1;i >= 0;i--){
if(S.charAt(i) == ' '){
charArray[j--] = '0';
charArray[j--] = '2';
charArray[j--] = '%';
}else {
charArray[j--] = S.charAt(i);
}
}
return new String(charArray, j+1, n - 1 - j);
}
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(n)
注:Java中的String为final修饰,不存在真正意义上的“原地修改”,但是这里提供了一种思路,对于其他语言(如c++)是可以提升空间复杂度的。