在一个含有空格字符的字符串中加入XXX,算法时间复杂度为O(N)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37817685/article/details/83155622
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);
	
	}

}

猜你喜欢

转载自blog.csdn.net/weixin_37817685/article/details/83155622