题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
要求:不能使用格外的数组,时间复杂度为 O(n)
题解:
每次遇到空格需要增加两个位置,如果从前往后移动,可能导致元素被多次移动,时间复杂度为 O(n^2)
所以采用统计空格总数量,计算最终数组总长度,然后从最末尾开始向后移动,可以直接移动到最终位置,每个字符只需移动一次,时间复杂度为 O(n)
class Solution {
public String replaceSpace(StringBuffer str) {
if (str == null || str.length() == 0) {
return "";
}
int spaceCount = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == ' ') {
spaceCount++;
}
}
if (spaceCount == 0) {
return str.toString();
}
int indexold = str.length() - 1;// 指向旧字符串末尾元素下标
int indexnew = str.length() + 2 * spaceCount - 1;// 指向新字符串末尾元素下标
str.setLength(str.length() + 2 * spaceCount);// 设置新长度,防止下标越界
while (indexold >= 0 && indexold <= indexnew) {//注意这里 如果indexold > indexnew,则说明后面的不用移动了
if (str.charAt(indexold) == ' ') {
str.setCharAt(indexnew--, '0');
str.setCharAt(indexnew--, '2');
str.setCharAt(indexnew--, '%');
} else {
str.setCharAt(indexnew--, str.charAt(indexold--));
}
}
return str.toString();
}
}
相关题目:
有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2。请实现一个函数,把A2中的所有数字插入到A1中并且所有的数字是排序的。
和前面例题一样,从前往后插入,会出现多次复制一个数字的情况。更好的办法是从尾到头比较A1和A2中的数字,并把较大的数字复制到A1的合适位置。