1. 程式人生 > >查詢兩個已經排好序的陣列的共同元素

查詢兩個已經排好序的陣列的共同元素

有兩個已排序的陣列 ,怎麼遍歷一遍,取出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 ++ ;             }         }     }

}