论坛首页 招聘求职论坛

一道算法面试题

浏览 22228 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-03-16  
e_man 写道
我的思路是开一个长度为n的数组x。遍历第一个1000W个元素的数组a,对于每一个值a[i],置x中相应的位为1,即x[a[i]]=1。再遍历第二个1000W个元素的数组b,对于每一个值b[i],判断x[b[i]]是否为1,为1则该值属于交集。

至于开多少长度的数组,若题目中指定元素为整数,则n=Integer.MAX_VALUE,若元素为长整数,则n=Long.MAX_VALUE,若不知道范围,ok,遍历一遍x取最大值呗。

最后的时间复杂度都是O(n).

不知道各位TX有没有更好的解题思路~


兄弟这样要开4G内存, 不好吧
0 请登录后投票
   发表时间:2010-03-16   最后修改:2010-03-16
用hash或是bit map都可以。java里可以直接使用BitSet类,或自己实现一个类似BitSet的位图结构:

import java.util.*;

public class Intersect {
    public static int[] getIntersect(int[] list1, int[] list2) {
        BitSet bs = new BitSet();
        Set<Integer> set = new HashSet<Integer>();

        for (int i = 0; i < list1.length; i++)
            bs.set(list1[i]);

        for (int i = 0; i < list2.length; i++)
            if (bs.get(list2[i]))
                set.add(list2[i]);

        int[] ret = new int[set.size()];
        int count = 0;

        for (Iterator<Integer> it = set.iterator(); it.hasNext();)
            ret[count++] = it.next();
        return ret;
    }

    public static void main(String[] args) {
        int[] list1 = { 1, 3, 5, 7, 9, 13, 18, 20, 300 };
        int[] list2 = { 2, 3, 6, 7, 10, 11, 18, 21, 3, 300 };
        int[] list3 = getIntersect(list1, list2);
        System.out.println(Arrays.toString(list3));
    }
}


运行结果:
=========
[18, 3, 7, 300]

没有考虑内存问题。
0 请登录后投票
   发表时间:2010-03-16  
e_man 写道
我的思路是开一个长度为n的数组x。遍历第一个1000W个元素的数组a,对于每一个值a[i],置x中相应的位为1,即x[a[i]]=1。再遍历第二个1000W个元素的数组b,对于每一个值b[i],判断x[b[i]]是否为1,为1则该值属于交集。

至于开多少长度的数组,若题目中指定元素为整数,则n=Integer.MAX_VALUE,若元素为长整数,则n=Long.MAX_VALUE,若不知道范围,ok,遍历一遍x取最大值呗。

最后的时间复杂度都是O(n).

不知道各位TX有没有更好的解题思路~


“长度为n的数组x”——销毁的物理内存很多,浪费空间,算是一种最浪费物理内存的方法。
0 请登录后投票
   发表时间:2010-03-16  
整数的话:先把两个数组排序,遍历一个数组去另一个数组用二分查找法查询···
0 请登录后投票
   发表时间:2010-03-16  
leon_a 写道
对第一个1000W数组hash,生成一个hash化数组。对第二个1000W数组采取同样算法hash,得到下标i,取hash[i]是否为null,不为null则是交集。剩余的问题是如何解决hash冲突


正解,Hash加计数的方式就可以啦~~
0 请登录后投票
   发表时间:2010-03-16  
leon_a 的方法不懂...

xserver 写道
整数的话,排序后比较好不好啊

排序包含太多次遍历,能保证int以内的话,感觉e_man的方法挺好,long就不一样了
0 请登录后投票
   发表时间:2010-03-16  
dingyaodanv1 写道
整数的话:先把两个数组排序,遍历一个数组去另一个数组用二分查找法查询···

....排序的话,排序完只需要同时遍历就行了
0 请登录后投票
   发表时间:2010-03-16  
e_man 写道
我的思路是开一个长度为n的数组x。遍历第一个1000W个元素的数组a,对于每一个值a[i],置x中相应的位为1,即x[a[i]]=1。再遍历第二个1000W个元素的数组b,对于每一个值b[i],判断x[b[i]]是否为1,为1则该值属于交集。

至于开多少长度的数组,若题目中指定元素为整数,则n=Integer.MAX_VALUE,若元素为长整数,则n=Long.MAX_VALUE,若不知道范围,ok,遍历一遍x取最大值呗。

最后的时间复杂度都是O(n).

不知道各位TX有没有更好的解题思路~


正解!
0 请登录后投票
   发表时间:2010-03-16  
强强爱妍妍 写道
e_man 写道
我的思路是开一个长度为n的数组x。遍历第一个1000W个元素的数组a,对于每一个值a[i],置x中相应的位为1,即x[a[i]]=1。再遍历第二个1000W个元素的数组b,对于每一个值b[i],判断x[b[i]]是否为1,为1则该值属于交集。

至于开多少长度的数组,若题目中指定元素为整数,则n=Integer.MAX_VALUE,若元素为长整数,则n=Long.MAX_VALUE,若不知道范围,ok,遍历一遍x取最大值呗。

最后的时间复杂度都是O(n).

不知道各位TX有没有更好的解题思路~


兄弟这样要开4G内存, 不好吧


兄弟你的4G内存如何得出来的?
我以INT型来算大约是40M。。。
0 请登录后投票
   发表时间:2010-03-16  
引用
对第一个1000W数组hash,生成一个hash化数组。对第二个1000W数组采取同样算法hash,得到下标i,取hash[i]是否为null,不为null则是交集。剩余的问题是如何解决hash冲突


赞成这样做
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics