有两个已排序的数组 ,怎么遍历一遍,取出2个相同的元素
这是一道面试题,看上去挺容易(面试时想了好久,没做出来)。没有在网上看到较为满意的算法。
下面是我的思路和代码,欢迎吐槽、交流、指正:
1.遍历一次,怎么确定遍历的大小(次数)?
a).若两个数组的大小相同,相同元素的角标相同,遍历的大小就是其中一个数组的长度(不一定,情况特殊不符合一般性)。
b).若两个数组的大小不同,相同元素的角标相同,遍历的大小就是小的数组长度(也是特殊情况)。
c).若两个数组的大小不确定,相同元素角标也不确定,现在遍历的大小最小是两个数组的大小的和。
2.确定了遍历的次数,怎么找相同的元素?
a).使用n1 , n2两个变量分别记录两个数组当前的角标(n1 , n2 初始值都是0)。
b).若n1大于数组1的长度,这时相同元素已经找完,可以直接结束掉程序(注:下面的代码没有结束)。
c).若n2大于数组2的长度,也可以结束掉程序。
d).若 数组1 在角标 n1 处的值大于 数组2 在 n2处额值,对n2自增。
e).若 数组1 在角标 n1 处的值小于 数组2 在 n2处额值,对n1自增。
f).剩下的这种情况就是数组1在n1处 和数组2 在n2处的值相同。
这里是这道题的java代码
我也是学过归并排序后找到的思路,代码里还有归并的影子。
public class GetCommFromTwoOrderArray {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = new int[] { 1, 2, 4, 5, 6};
int[] b = new int[] { 0, 4, 6, 8};
getComm(a, b);
}
private static void getComm(int[] a, int[] b) {
// TODO Auto-generated method stub
int n1 = 0, n2 = 0;
for (int i = 0; i < a.length + b.length; i++) {
if (n1 >= a.length) {
n2++;// return
} else if (n2 >= b.length) {
n1++;// retrun
} else if (a[n1] > b[n2]) {
n2++;
} else if (a[n1] < b[n2]) {
n1++;
} else if (a[n1] == b[n2]) {
System.out.println(a[n1]);
n1 ++ ;
n2 ++ ;
}
}
}
}
1200

被折叠的 条评论
为什么被折叠?



