有两个有序整数集合a和b,写一个函数找出它们的交集?
2016-11-15 18:55
429 查看
方法一:
方法二:
方法三:
三种性能对比测试:
结果对比:
方法一用时:359 毫秒
方法二用时:160 毫秒
方法三用时:10 毫秒
private static Set<Integer> setMethod(int[] a,int[] b){ Set<Integer> set = new HashSet<Integer>(); Set<Integer> set2 = new HashSet<Integer>(); for(int i=0; i<a.length; i++) { set.add(a[i]); } for(int j=0; j<b.length; j++) { if(!set.add(b[j])) set2.add(b[j]); } return set2; }
方法二:
private static Set<Integer> forMethod(int[] a,int[] b){ Set<Integer> set=new HashSet<Integer>(); int i=0,j=0; while(i<a.length && j<b.length){ if(a[i]<b[j]) i++; else if(a[i]>b[j]) j++; else{ set.add(a[i]); i++; j++; } } return set; }
方法三:
private static int[] intersect(int[] a, int[] b) { if (a[0] > b[b.length - 1] || b[0] > a[a.length - 1]) { return new int[0]; } int[] intersection = new int[Math.max(a.length, b.length)]; int offset = 0; for (int i = 0, s = i; i < a.length && s < b.length; i++) { while (a[i] > b[s]) { s++; } if (a[i] == b[s]) { intersection[offset++] = b[s++]; } while (i < (a.length - 1) && a[i] == a[i + 1]) { i++; } } if (intersection.length == offset) { return intersection; } int[] duplicate = new int[offset]; System.arraycopy(intersection, 0, duplicate, 0, offset); return duplicate; }
三种性能对比测试:
public class NumberCrossTest {
public static void main(String[] args) {
int[] a1 = new int[100000];
for (int i = 0; i < a1.length; i++) {
a1[i] = i + 10;
}
int[] a2 = new int[200000];
for (int i = 0; i < a2.length; i++) {
a2[i] = i + 20;
}
long begin = System.currentTimeMillis();
Set<Integer> set1 = setMethod(a1, a2);
long end = System.currentTimeMillis();
System.out.println(end - begin);// 359
begin = System.currentTimeMillis();
Set<Integer> set2 = forMethod(a1, a2);
end = System.currentTimeMillis();
System.out.println(end - begin);// 160
begin = System.currentTimeMillis();
int[] c = intersect(a1, a2);
end = System.currentTimeMillis();
System.out.println(end - begin);// 10
// 测试两种方法的结果是否相等
System.out.println(set1.equals(set2));// true
Set<Integer> set3 = new HashSet<Integer>();
for (int i = 0; i < c.length; i++) {
set3.add(c[i]);
}
System.out.println(set1.equals(set3));// true
}
private static Set<Integer> setMethod(int[] a, int[] b) {
Set<Integer> set = new HashSet<Integer>();
Set<Integer> set2 = new HashSet<Integer>();
for (int i = 0; i < a.length; i++) {
set.add(a[i]);
}
for (int j = 0; j < b.length; j++) {
if (!set.add(b[j]))
set2.add(b[j]);
}
return set2;
}
private static Set<Integer> forMethod(int[] a, int[] b) {
Set<Integer> set = new HashSet<Integer>();
int i = 0, j = 0;
while (i < a.length && j < b.length) {
if (a[i] < b[j])
i++;
else if (a[i] > b[j])
j++;
else {
set.add(a[i]);
i++;
j++;
}
}
return set;
}
private static int[] intersect(int[] a, int[] b) { if (a[0] > b[b.length - 1] || b[0] > a[a.length - 1]) { return new int[0]; } int[] intersection = new int[Math.max(a.length, b.length)]; int offset = 0; for (int i = 0, s = i; i < a.length && s < b.length; i++) { while (a[i] > b[s]) { s++; } if (a[i] == b[s]) { intersection[offset++] = b[s++]; } while (i < (a.length - 1) && a[i] == a[i + 1]) { i++; } } if (intersection.length == offset) { return intersection; } int[] duplicate = new int[offset]; System.arraycopy(intersection, 0, duplicate, 0, offset); return duplicate; }
}
结果对比:
方法一用时:359 毫秒
方法二用时:160 毫秒
方法三用时:10 毫秒
相关文章推荐
- A,B两个整数集合,设计一个算法求他们的交集
- A,B两个整数集合,设计一个算法求他们的交集,尽可能的高效(牛客网)
- 求两个有序整数集合的交集,比比谁的算法快!
- 程序员面试金典——解题总结: 9.17中等难题 17.6给定一个整数数组,编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n - m越小越好,也就是说,找出
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A,B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- 转:A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- 有一个整数数组,请编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n-m应该越小越好,也就是说,找出符合条件的最短序列。 给定一个int数组A和数组的大小n,请
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- 找出两个整数中的较小者(重在使用return从函数中返回一个值)
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- 求有序整数集合a和b的交集函数
- .NET中,写一个函数找出一个整数数组中,第二大的数(整数数组作为函数参数)
- 输入4个整数,找出其中最大的数,用一个函数来实现.cpp