替换空格
题目
题目:请实现一个函数,吧字符串中的每个空格替换成“%20”。例如输入“We are happy”,则输出”We%20are%20happy“。
思路
1: 从左到右依次遍历,每遇到一个空格,则将空格替换成%20。不过此每一次遇到空格,都需要移动将空格后面的字符往后移动2位,然后将%20插入。时间复杂度O(n^2),空间复杂度(空格*2)
2:重新分配内存,依次将字符复制到新内存中,遇到空格置换为%20。此方法不需要每次都移动后面的字符串,不过需要重新分配内存。
3:考虑到每次都需要往后移动,为何不直接一次性计算所有的空格数,然后从末尾遍历空格,直接将末尾的字符往后移动未遍历空格数*2的空间。此方法不需要每一次都将空格后的所有字符都移动。
实现代码
思路1
//时间复杂度O(n^2),空间复杂度(空格*2)
//没有新分配内存,在原字符串上修改(有多余的空间)。length为字符内存的长度。
//在空格处插入%20,后面的内容往后移动。每一个空格都要重复移动后面的内容。
public static char[] replaceBlank2(char[] charArray,int length){
if(charArray == null || length <=0)
return null;
int n = charArray.length; //字符的长度。
int k = 0; //前面已经出现的空格数(每出现一个,往后移动2位)
for (int i = 0; i < n+2*k; i++ ) {
if(charArray[i] == ' '){ //遇到空格
for(int j = n+2*k; j > i;j--) //把后面的字符往后移动
charArray[j+2] = charArray[j];
charArray[i++] = '%'; //插入%20
charArray[i++] = '2';
charArray[i++] = '0';
k++;
}
if(n+2*k > length){ //分配的内存不够
System.err.println("字符数组内存不足");
return null;
}
}
return charArray;
}
思路2
public static char[] replaceBlank1(char[] charArray){
int n = charArray.length; //字符的长度。
char[] newCharArray = new char[3*n]; //新字符串
if(charArray == null)
return null;
int j = 0; //i为原字符串的指针,j为新字符串的指针
for(int i=0;i<n;i++){
if(charArray[i] == ' '){ //空格,替换
newCharArray[j++] = '%';
newCharArray[j++] = '2';
newCharArray[j++] = '0';
}
else {
newCharArray[j++] = charArray[i]; //不是空格就复制
}
}
return newCharArray;
}
思路3
//时间复杂度O(n),空间复杂度(空格*2)
//没有新分配内存,在原字符串上修改(有多余的空间)。length为字符内存的长度。
//在空格处插入%20,从后往前移动,(不需要重复移动前面的内容。)
public static char[] replaceBlank3(char[] charArray,int length){
if(charArray == null || length <= 0)
return null;
int originalLength = 0; //字符串原始实际长度
int newLength = 0; //新字符串长度
int numberOfBlank = 0; //空格的数量
int i=0;
//计算原字符串长度和空格数量
while(charArray[i] != '\0'){
++ originalLength;
if(charArray[i] == ' ')
++ numberOfBlank;
++ i;
}
newLength = originalLength +2*numberOfBlank;
//内存不足溢出
if(newLength > length){
System.err.println("字符数组内存不足");
return null;
}
int indexOforiginal = originalLength;
int indexOfNew = newLength;
//当indexOforiginal移动到0时,或者前面没有空格时,即indexOfNew == indexOforiginal时,结束
while(indexOforiginal>=0 && indexOfNew > indexOforiginal){
if(charArray[indexOforiginal] == ' '){ //当为空格时插入
charArray[indexOfNew--] = '0';
charArray[indexOfNew--] = '2';
charArray[indexOfNew--] = '%';
}else {
charArray[indexOfNew--] = charArray[indexOforiginal]; //不是空格则直接复制
}
indexOforiginal--;
}
return charArray;
}
测试用例
public static void main(String[] args) {
char[] str = new char[50];
str[0] = 'w';
str[1] = 'e';
str[2] = ' ';
str[3] = 'h';
str[4] = 'a';
str[5] = ' ';
str[6] = 'p';
char[] replaceBlank2 = replaceBlank3(str,50);
System.out.println(new String(replaceBlank2));
}