偶然在一本书上看到这样一道题觉得听一意思的就拿来做了一下,题目是这样设置的
在已知一维数组A[m+n]中一次存放两个线性表(a1,a2,a3,a4...am),(b1,b2,b3...bn),试写出一个函数将两个顺序表位置互换,即由(a,1,a2,a3,a4...am,b1,b2,b3...bn)
转换成(b1,b2,b3...bn,a,1,a2,a3,a4...am)
要求空间复杂度为O(1)想必这种题会经常出现在面试题目中吧,哈哈,扯远了,以下是我的答案,水平有限,如有纰漏还望各位大神不吝赐教。
乍一看题目还挺麻烦的,两个数组大小不一样,原地逆置循环次数不容易控制,换个思路重新整理一下发现可以用一种很巧妙的方法分三步实现
第一步:将字母序列逆置
第二部:将数字序列逆置
第三部:将数组整体逆置
其中逆置函数如下:
逆置函数需要两个参数,分别为需要逆置的数组起始位置[start]和终止位置[end];
public static void reverse(int start,int end){//逆置函数
char temp;
while(start<end) {
temp = array[start];
array[start++] = array[end];
array[end--] = temp;
}
}
tip:char array[]={'A','B','C','D','E','F','G','H','1','2','3','4'}
测试数组A[0-7],B[8-11]
测试结果如下:
完整代码
public class Main {
public static char array[]={'A','B','C','D','E','F','G','H','1','2','3','4'};
public static void main(String[] args) {
reverse(0,7);//逆置字母序列结果为:HGFEDCBA1234
reverse(8,11);//逆置数字序列结果为:HGFEDCBA4321
reverse(0,11);//整体逆置结果为:1234ABCDEFG
print(array);
}
public static void reverse(int start,int end){//逆置函数
char temp;
while(start<end) {
temp = array[start];
array[start++] = array[end];
array[end--] = temp;
}
}
private static void print(char[] array) {
for (int i = 0; i <array.length; i++)
System.out.print(array[i]);
System.out.println();
}
}