一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 1250|回复: 4
收起左侧

Palantir OA

[复制链接] |试试Instant~ |关注本帖
lfzh123 发表于 2016-7-7 08:10:36 | 显示全部楼层 |阅读模式

2016(7-9月) 码农类 硕士 全职@Palantir - 网上海投 - 在线笔试 |Pass在职跳槽

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
Palantir OA
还是两道原题,我也是参考了地里同志们的code。因为我看了两个帖子都说是按照这个思路做的,但都没有通过,我也有点诧异。然后第一题我又写了一种解法(先把字符串排序,通过comparator,然后找出相邻的最小difference),test也都通过了。. 1point3acres.com/bbs
这样的好处的当String array比较小的时候O(N*logN) 比 O(1440) 会快一点。
http://www.1point3acres.com/bbs/ ... D311%26sortid%3D311. 1point 3acres 璁哄潧
. from: 1point3acres.com/bbs
今天收到HR的邮件说要talk一下,感觉是这个OA通过了。

评分

1

查看全部评分

vesalius 发表于 2016-8-24 08:30:31 | 显示全部楼层
lfzh123 发表于 2016-8-24 07:42
如果转化为1440的话,需要线性的traverse这个数组,O(1440). 所以当N比较小的时候(N < 100), O(N*logN)  ...

那为什么要改写comparator 比较string, 而不是直接生成一个integer数组比较integer呢,是为了省空间么?    因为在之后计算最小差的时候还是算的minutes
回复 支持 1 反对 0

使用道具 举报

vesalius 发表于 2016-8-23 17:50:53 | 显示全部楼层
请问楼主为什么对字符串排序,再比较的时候还是按照integer再比较,为什么不是先把字符串转换成int[] 再排序, 然后返回min呢? 有什么concern我没想到么
回复 支持 反对

使用道具 举报

vesalius 发表于 2016-8-23 18:07:54 | 显示全部楼层
楼主改写comparator比较string是第一种这样写的么,我测试出来不如直接比较integer快哇?我写了第一种和第二种,测试出来还是第三种快,但原贴说第三种跪掉了,有没有人指教下下面三种方法哪种更好?
方法一:
public int getMinTimeDifference(String[] times) {
            if (times == null || times.length <= 1) {
                throw new IllegalArgumentException("unvaild input");
            }
            Arrays.sort(times, new Comparator<String>() {
                public int compare(String strA, String strB) {
                    if (Integer.parseInt(strA.substring(0,2)) > Integer.parseInt(strB.substring(0,2))) {
                        return 1;
                    } else if (Integer.parseInt(strA.substring(0,2)) < Integer.parseInt(strB.substring(0,2))) {
                        return -1;
                    } else if (Integer.parseInt(strA.substring(3,5)) > Integer.parseInt(strB.substring(3,5))) {
                        return 1;
                    } else if (Integer.parseInt(strA.substring(3,5)) < Integer.parseInt(strB.substring(3,5))) {
                        return -1;
                    } else {
                        return 0;
                    }
                }
            });
            int firstTime = Integer.parseInt(times[0].substring(0, 2)) * 60 + Integer.parseInt(times[0].substring(3, 5));
            int lastTime = Integer.parseInt(times[times.length - 1].substring(0, 2)) * 60 + Integer.parseInt(times[times.length - 1].substring(3, 5));
            int minDiff = firstTime + 1440 - lastTime;
            for (int i = 1; i < times.length; i++) {
               int temp = Integer.parseInt(times.substring(0, 2)) * 60 + Integer.parseInt(times.substring(3, 5))
               - (Integer.parseInt(times[i - 1].substring(0, 2)) * 60 + Integer.parseInt(times[i - 1].substring(3, 5)));
               minDiff = Math.min(minDiff, temp);
               if (minDiff == 0) {
               return 0;
               }
            }
            return minDiff;
        }
方法二:
public int getMinTimeDifference(String[] times) {
        if (times == null || times.length < 2) {
            throw new IllegalArgumentException("unvaild input");
        }
        int[] timeMinutes = new int[times.length];
        for (int i = 0; i < times.length; i++) {
            timeMinutes = Integer.parseInt(times.substring(0, 2)) * 60 + Integer.parseInt(times.substring(3, 5));
        }
        Arrays.sort(timeMinutes);
        int min = timeMinutes[0] + 1440 - timeMinutes[timeMinutes.length - 1];
        for (int i = 1; i < timeMinutes.length; i++) {
            int temp = timeMinutes - timeMinutes[i - 1];
            min = Math.min(min, temp);
            if (min == 0) {
                return min;
            }
        }
        return min;

    }
. more info on 1point3acres.com
方法三:
   private static int TOTAL_MINUTES = 1440; //total number of minutes between 00:00 and 23:59 = 60*24 = 1440;. more info on 1point3acres.com
   public int getMinTimeDifference(String[] times) {
       int N = times.length;
       boolean[] hasTime = new boolean[TOTAL_MINUTES+1]; // true of a give time (converted into minutes) exsits
       int minMinute = TOTAL_MINUTES, maxMinute = 0; // lower and upper bound of time array
       for(int i=0; i<N; i++) {
           int minutes = Integer.parseInt(times.substring(0,2))*60 + Integer.parseInt(times.substring(3,5)); // convert time string into minutes
           if(hasTime[minutes]) return 0; // time already exsited, so difference is automatically 0
           hasTime[minutes] = true;
           minMinute = minutes < minMinute ? minutes : minMinute;
           maxMinute = minutes > maxMinute ? minutes : maxMinute;
       }
       int res = Math.min(maxMinute-minMinute, minMinute-maxMinute+TOTAL_MINUTES); // initialize the result based on minMinute and maxMinute
       int prevMinuteIndex = minMinute; // previous exist minute
       int index = minMinute; // moving index to check if hasTime[index] is true
       while(++index <= maxMinute) {
           if(hasTime[index]) {
               int diff = index - prevMinuteIndex;
               res = diff < res ? diff : res; // update result
               prevMinuteIndex = index; // update previous
           }
       }
       return res;

   }

回复 支持 反对

使用道具 举报

 楼主| lfzh123 发表于 2016-8-24 07:42:01 | 显示全部楼层
vesalius 发表于 2016-8-23 17:50. visit 1point3acres.com for more.
请问楼主为什么对字符串排序,再比较的时候还是按照integer再比较,为什么不是先把字符串转换成int[] 再排 ...

如果转化为1440的话,需要线性的traverse这个数组,O(1440). 所以当N比较小的时候(N < 100), O(N*logN) < O(1440) 对吧?
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-4 18:28

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表