查找两个已经排好序的数组的共同元素

有两个已排序的数组 ,怎么遍历一遍,取出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 ++ ;
            }
        }
    }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值