有两个有序整数集合a和b,写一个函数找出它们的交集
来源:互联网 发布:js改变input的宽度 编辑:程序博客网 时间:2024/05/16 17:55
有两个有序整数集合a和b,写一个函数找出它们的交集
方法一:
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,写一个函数找出它们的交集
0 0
- 有两个有序整数集合a和b,写一个函数找出它们的交集
- 有两个有序整数集合a和b,写一个函数找出它们的交集?
- A、B两个整数集合的交集
- 两个整数集合A和B,求其交集
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- A,B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集
- A,B两个整数集合,设计一个算法求他们的交集
- A,B两个整数集合,设计一个算法求他们的交集,尽可能的高效(牛客网)
- 给定一个值S,在有序数组中找出两个元素A和B,使 A+B = S.
- exploring expect
- 网站如何选择合适空间?
- Cocos2d-x3.3beta0创建动画的3种方式
- 线下编程2题-Peter的x
- 使用C模拟Java中的ArrayList
- 有两个有序整数集合a和b,写一个函数找出它们的交集
- ubuntu 更改目录及其下的子目录和文件的访问权限
- ImageLoader 俩个比较坑的问题。
- admob xcode升级问题从早期版本升级到新版本出现的错误
- android中不同activity之间共享数据
- 第十九章 19.2.2节练习
- <数据结构> 实验二 线性表的实验之一
- [学习记录用][Win32 API]GetLastError错误码信息翻译工具编写
- android Dialog 自定义 继承Dialog基类