【剑指offer】题目4

来源:互联网 发布:java默认访问修饰符 编辑:程序博客网 时间:2024/05/17 01:02

题目:给定一个字符数组,存放长度为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上,给定了两个有序的数组,其中一个空间足够大,然后就可以按照上面的思路从末尾形成新的有序数组。

原创粉丝点击