import java.util.Scanner;
/**
*
*/
/**
* @author jueying:
* @version 创建时间:2018-10-18 下午10:54:54
* 类说明
*/
/**
* @author jueying
*
*/
public class Test2 {
public void fun(char a[],int num){//原始字符数组 空格数量
int P1=a.length;//原始数组的末端位置 14
int P2=P1+2*num;//移动后数组的末端 20
char removeAfterArr[]=new char[P2];
remove(a,removeAfterArr,P1-1,P2-1);
}
public void remove(char a[],char removeAfterArr[],int P1,int P2){
for(int i=P1;i>=0;i--){//p1向前移动 15
if(P1!=P2&&P1>0&&P2>0){
System.out.print(a[i]);
if(a[i]==' '){//遇到空格时
System.out.println("P2:"+P2+" 空格"+i+" P1:"+P1);
removeAfterArr[P2--]='0';//把‘0’复制到当前指向的位置向前一步
removeAfterArr[P2--]='2';//向前一步
removeAfterArr[P2--]='%';//向前一步
--P1;
}else{//没有遇到空格时P1,P2同步从右向左前进(你走一步,我走一步)
removeAfterArr[P2]=a[i];//P1指向的当前元素复制到P2 20
--P2;
--P1;
}
}else{
removeAfterArr[P2--]=a[i];
}
}
System.out.println();
for(int j=0;j<removeAfterArr.length;j++){
System.out.print(removeAfterArr[j]);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//思路描述如下 例子 a="abcd ddd dd ee" 长度15 加末尾'\0'结束符号
//1.在上面这个字符串a中,空格存在3个,因为需要用%20来替换,所以没替换一个空格长度会整体增加2,那么如果有3个空格,替换后的长度就是21
//原字符 abcd ddd dd ee
// (1)abcd%20ddd dd ee
// (2)abcd%20ddd%20dd ee
// (3)abcd%20ddd%20dd%20ee
//当只有一个空格时,也就是一个空格需要移动后面的O(n)个字符
//那么当有O(n)个空格时,时间效率就是O(n^2),直接这样的去编写代码不会让面试官满意的,时间复杂度需要优化
//优化分析
//1.一个空格长度会增加2,那么3个空格会增加6,我们可以先计算出移动完毕后的数组空间
//2.用两个指针P1和P2,P1放在原始数组的末端,P2放在移动后的数组的末端
//3.P1从后向前依次移动,把元素分别复制到P2指向的初始位置,从右到左依次放过来,并随之移动P2的位置,复制一个字符过去,P2向左一步移动
//4.当遇到空格时,从P2指向的位置依次增加字符02%,P2同样增加一个向左移动一步
//5.重复第3和第4步,没有遇到空格前,P1依次向左移动把指到的元素依次复制到P2指到的位置,复制一个P2向左移动一步
//当遇到空格时,P1保持不动,依次从右到左增加02%,指导P1和P2指到同一个元素时,移动结束,时间复杂度为N
String a="abcd ddd dd ee";//输入字符串
char b[]=a.toCharArray();
int num=0;
for(int i=0;i<b.length;i++){
if(b[i]==' '){
++num;
}
}
Test2 t=new Test2();
t.fun(b,num);
}
}