阿里巴巴一道笔试题的答案

来源:互联网 发布:python help 用法 编辑:程序博客网 时间:2024/05/01 03:47

问题:有两个有序整数集合a和b,写一个函数找出它们的交集?

题目的意思应该是这样的,直接写不算难,我觉得应该是考写出比较高效的算法

大家帮忙回答。

 

我对上边的代码优化了一下,做了两个对比,贴出来大家看看:

import java.util.ArrayList;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Test test = new Test();
test.test1();
test.test2();

}


public void test1() {
int[] a = { 2, 3, 4, 4, 4, 4, 7, 8, 8, 8, 8, 9, 100, 130, 150, 160 };
int[] b = { 4, 6, 7, 7, 7, 7, 8, 8, 9, 10, 100, 130, 130, 140, 150 };
int i = 0, j = 0, k = 0, m = 0, n = 0;
ArrayList al = new ArrayList();
while (i < a.length && (j < b.length)) {
if (a[i] < b[j]) {
i++;
m++;
}
else if (a[i] > b[j]) {
j++;
n++;
}
else {
al.add(a[i]);
i++;
j++;
}
k++;
k++;
}
System.out.println("交集:"+al);
System.out.println("循环体比较次数:"+k);
System.out.println("m比较次数:"+m);
System.out.println("n比较次数:"+n);
System.out.println("总比较次数:"+(int)(k+m+n));

}

public void test2() {
int[] a = { 2, 3, 4, 4, 4, 4, 7, 8, 8, 8, 8, 9, 100, 130, 150, 160 };
int[] b = { 4, 6, 7, 7, 7, 7, 8, 8, 9, 10, 100, 130, 130, 140, 150 };
int i = 0, j = 0, k = 0, m=0,n=0,x = 0, y = 0;
ArrayList al = new ArrayList();
while (i < a.length && (j < b.length)) {
while(i < a.length-1&&a[i]==a[i+1]) {
i++;
x++;
x++;
}
while(j < b.length-1&&b[j]==b[j+1]) {
j++;
y++;
y++;
}
if (a[i] < b[j]) {
i++;
m++;
}
else if (a[i] > b[j]) {
j++;
n++;
}
else {
al.add(a[i]);
i++;
j++;
}
k++;
k++;
}
System.out.println("交集:"+al);
System.out.println("循环体比较次数:"+k);
System.out.println("x排除重复比较次数:"+x);
System.out.println("y排除重复比较次数:"+y);
System.out.println("m比较次数:"+m);
System.out.println("n比较次数:"+n);
System.out.println("总比较次数:"+(int)(k+m+n+x+y));
}

}


运行结果:


交集:[4, 7, 8, 8, 9, 100, 130, 150]
循环体比较次数:44
m比较次数:7
n比较次数:7
总比较次数:58
交集:[4, 7, 8, 9, 100, 130, 150]
循环体比较次数:24
x排除重复比较次数:12
y排除重复比较次数:10
m比较次数:2
n比较次数:3
总比较次数:51

可以看到优化的代码效率略微有所改进,结果也更合理。

原创粉丝点击