【剑指offer】题目4

题目:给定一个字符数组,存放长度为len的字符,且数组还有很多剩余的空间,要求把数组中的空格替换为“%20”。

要求只在给定的数组上操作,不能另外增加数组。

一个简单的实现是,len位置开始生成新的数组,一边从0位置开始遍历,一边把值赋到len位置开始的新数组,然后再把len位置的数组移到0位置。这个方法是On级别,但是需要2n+的空间。

更好的办法是从末尾开始。就是先统计空格的数目,然后就知道新的字符串的长度,假设末位置为i2,原来的末位置为i1,从i1往回遍历,填充i2。这样的空间复杂度降低了很多。

	public static void main(String args[]){
		char[] a= new char[100];
		a[0] = 'a';
		a[1] = 'b';
		a[2] = ' ';
		a[3] = 'c';
		int len = convert(a, 4);
		print(a, len);
	}
	
	public static int convert(char[] array, int len){
		int count = 0;
		for(int i = 0; i < len; i++){
			if(array[i] == ' ')
				count++;
		}
		int p1 = len - 1;
		len = count * 2 + len;
		int p2 = len - 1;
		while(p1 != p2){
			if(array[p1] != ' '){
				array[p2] = array[p1];
				p2--;
			}else{
				array[p2--] = '0';
				array[p2--] = '2';
				array[p2--] = '%';
			}
			p1--;
		}
		return len;
	}
	
	public static void print(char[] array, int len){
		String s = "";
		for(int i = 0; i < len; i++){
			s += array[i];
		}
		System.out.println(s);
	}

另外这个思路也可以运用到merge sort上,给定了两个有序的数组,其中一个空间足够大,然后就可以按照上面的思路从末尾形成新的有序数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值