查詢兩個已經排好序的陣列的共同元素
有兩個已排序的陣列 ,怎麼遍歷一遍,取出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 ++ ; } } }
}