题目描述
请实现一个函数,把字符串中的空格替换为“%20”,在原来的字符串上做替换,时间复杂度为O(n)。
拓展:
有两个排序数组A1和A2,内存在A1的末尾有足够多的空间容纳A2,请实现一个函数将A2插入的A1中,最终A1仍是排序的。
解题思路
替换空格
我们考虑从后往前进行替换:
- 首先遍历原字符串,找出字符串的长度以及其中的空格数量;
- 根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度;
- 设置两个指针p1和p2分别指向原字符串和新字符串的末尾位置;
- 如果p1指向内容不为空格,那么将内容赋值给p2指向的位置,如果p1指向为空格,那么从p2开始赋值“02%”;
- 直到循环条件归0(更优的:p1==p2)时表明字符串中的所有空格都已经替换完毕;
示例过程如下:
拓展题
和替换空格思路类似,从新的尾部开始填充两个数组尾部较大的数,直到遍历完成。
代码
替换空格
public static char[] replaceBlank(char[] str,int length) {
if(str==null || str.length==0)
return str;
int tailIndex = length - 1;
for(int i = 0;i < length;i++){
if(str[i]==' '){
tailIndex += 2;
}
}
for(int i = length - 1;i >= 0 && tailIndex!=i;i--){
if(str[i]!=' '){
str[tailIndex--] = str[i];
} else {
str[tailIndex--] = '0';
str[tailIndex--] = '2';
str[tailIndex--] = '%';
}
}
return str;
}
合并数组
public static int[] mergeSortArrays(int[] A,int lenA,int[] B,int lenB){
if(B==null || lenB==0)
return A;
//当A中无数时,或者A的最大值小于B的最小值,直接将B复制到A的尾部
if(lenA==0 || B[0] > A[lenA - 1]){
for(int i = 0;i < lenB;i++){
A[i+lenA] = B[i];
}
return A;
}
int indexA = lenA - 1;
int indexB = lenB - 1;
for(int i = lenA+lenB - 1;i >=0;i--){
if(indexA >=0 && indexB >=0){
if(A[indexA] > B[indexB]){
A[i] = A[indexA];
indexA--;
} else {
A[i] = B[indexB];
indexB--;
}
} else if(indexA < 0){
A[i] = B[indexB--];
} else if(indexB < 0){
A[i] = A[indexA--];
}
}
return A;
}