一亩三分地

 找回密码 注册账号

扫描二维码登录本站


码农求职神器Triplebyte
不用海投
内推多家公司面试

Total Comp Calculator
输入offer信息
系统自动计算每年收入

科技公司如何
用数据分析驱动产品开发
coupon code 250off 立减$250

深入浅出AB Test
从入门到精通
coupon code 250off 立减$250
游戏初创公司招聘工程师、UIUX Designer和游戏策划
坐标湾区
DreamCraft创始团队
招聘游戏开发工程师
查看: 2222|回复: 34
收起左侧

狗家电面

[复制链接] |试试Instant~
我的人缘0

分享帖子到朋友圈
本楼: 👍   100% (2)
 
 
0% (0)   👎
全局: 👍   88% (15)
 
 
11% (2)    👎

2018(10-12月) 码农类General 硕士 全职@Google - 内推 - 技术电面  | Pass/Offer | fresh grad应届毕业生

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

您需要 登录 才可以下载或查看,没有帐号?注册账号

x
面试官迟到了15分钟orz...不废话,直接做题,只有一道题
游客,本帖隐藏的内容需要积分高于 120 才可浏览,您当前积分为 0。
查看如何攒积分 Click here for more info.




补充内容 (2018-11-10 15:35):
数组没有排序

评分

参与人数 8大米 +20 收起 理由
gladtbx + 3 给你点个赞!
feng + 3 给你点个赞!
hazai + 3 给你点个赞!
tai扯了 + 1 赞一个
xn1990114 + 5 给你点个赞!
lzhong + 3 楼主好运
wzy602867832 + 1 赞一个
xijie + 1 赞一个

查看全部评分


上一篇:高盛 七号superday 求点大米
下一篇:Houzz面经

本帖被以下淘专辑推荐:

我的人缘0
frankchang0311 2018-11-10 14:16:54 | 显示全部楼层
本楼: 👍   100% (2)
 
 
0% (0)   👎
全局: 👍   100% (2)
 
 
0% (0)    👎
不知道这样对吗,O(n)
[Java] 纯文本查看 复制代码
    public static long findK(int[] salary, int budget) {
        int n = salary.length;
        int sum = 0;
        Arrays.sort(salary);
        int[] sums = new int[salary.length];
        for (int i = 1; i < n; i++) {
            sum += salary[i - 1];

            int rest = budget - sum;
            long expect = rest / (n - i);
            if (salary[i] > expect) {
                return expect;
            }
        }

        return 0;
    }


补充内容 (2018-11-10 14:34):
如果工资没排序的话 就O(nlogn)
回复

使用道具 举报

我的人缘0
stellari 2018-11-13 11:25:56 | 显示全部楼层
本楼: 👍   100% (1)
 
 
0% (0)   👎
全局: 👍   98% (485)
 
 
1% (5)    👎
ppcbr 发表于 2018-11-13 10:35
啊。。我感觉好像不用排序扫一遍O(N)就行?
先用 buget/n (n为 array 的长度)求出一个平均数(base)
...

这样不行,因为小于等于base的数确实一定不需要降低,但是大于base的数并不一定需要降低。所以仅根据base计算出的cnt是不可信赖的。比如这个例子:[100, 200, 300, 400, 500, 600], budget = 2000。你的代码算出的base是333,所以会认为400, 500, 600都需要降低;但事实上只需要将600降到500即可。

评分

参与人数 1大米 +3 收起 理由
hazai + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

我的人缘0
wofaint 2018-11-11 05:28:29 | 显示全部楼层
本楼: 👍   100% (1)
 
 
0% (0)   👎
全局: 👍   100% (5)
 
 
0% (0)    👎
这道题有两种解法:1. 是二分答案,时间复杂度是 O(P*log(W)), P是人数,W是工资范围(max_wage - budget / P),不用对工资数组排序( foryousee 的解法);2. 是先对工资数组排序,再遍历(frankchang0311 的解法),时间复杂度是O(P) 如果工资数组已排序,否则是 O(P*log(P)) 因为要先排序。两种解法的空间复杂度都是O(1).
两种解法各有优劣(看 P 大还是 W 大)。

评分

参与人数 1大米 +3 收起 理由
hazai + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

我的人缘0
当横压一代 2018-11-10 16:25:05 | 显示全部楼层
本楼: 👍   100% (1)
 
 
0% (0)   👎
全局: 👍   97% (121)
 
 
2% (3)    👎
frankchang0311 发表于 2018-11-10 14:16
不知道这样对吗,O(n)
[mw_shl_code=java,true]    public static long findK(int[] salary, int budget)  ...

这个666字数字数

补充内容 (2018-11-10 16:41):
要考虑一下这种情况:[100, 200, 300, 400], budget = 40。
回复

使用道具 举报

我的人缘0
 楼主| 宇宙小清新 2018-11-10 11:36:47 | 显示全部楼层
本楼: 👍   100% (1)
 
 
0% (0)   👎
全局: 👍   88% (15)
 
 
11% (2)    👎
foryousee 发表于 2018-11-10 11:17
应该是binary search就可以了吧,上限是最大值,下限是budge / 人数

是的是的
回复

使用道具 举报

我的人缘0
foryousee 2018-11-10 11:17:43 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   90% (110)
 
 
9% (11)    👎
应该是binary search就可以了吧,上限是最大值,下限是budge / 人数
回复

使用道具 举报

我的人缘0
郁小南 2018-11-10 11:43:02 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   96% (193)
 
 
3% (7)    👎
解法:排序 O(nlogn) 或者用Stack O(n),不知是否有更好的解法

补充内容 (2018-11-10 11:43):
看到Binary Search看来我还是太年轻了(。

补充内容 (2018-11-10 11:44):
啊 员工的工资是已经排序的话那确实Binary Search……但是不排序的话可能还是O(n)
回复

使用道具 举报

我的人缘0
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   93% (30)
 
 
6% (2)    👎
求问楼主 binary search我也不太明白啊 有可能不求和就能算出k么 只找到临界值的话 比budget高了多少可以算出来么 真心求教
回复

使用道具 举报

我的人缘0
foryousee 2018-11-10 13:40:57 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   90% (110)
 
 
9% (11)    👎
郁小南 发表于 2018-11-10 11:43
解法:排序 O(nlogn) 或者用Stack O(n),不知是否有更好的解法

补充内容 (2018-11-10 11:43):

麻烦问一下stack怎么做?实在想不出来。binary search其实跟排不排序没关系。每一次binary search的cost其实还是n,最后的cost会是O(nlog(max - min))
回复

使用道具 举报

我的人缘0
foryousee 2018-11-10 13:45:08 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   90% (110)
 
 
9% (11)    👎
[Java] 纯文本查看 复制代码
public int findK(int[] salary, int budget) {
        int lo = budget / salary.length;
        int hi = Integer.MIN_VALUE;
        for(int sa : salary) {
            hi = Math.max(hi, sa);
        }
        while(lo < hi) {
            int mid = (hi - lo) / 2 + lo;
            int cost = 0;
            for(int sa : salary) {
                if(sa <= mid) {
                    cost += sa;
                } else {
                    cost += mid;
                }
            }
            if(cost == budget) {
                return mid;
            } else if(cost < budget) {
                lo = mid + 1;
            } else {
                hi = mid;
            }
        }
        return lo;
    }

这个是code,stack怎么在n之内解出来呢?完全没思路- -

评分

参与人数 2大米 +4 收起 理由
Ronald4545 + 3 给你点个赞!
tai扯了 + 1 赞一个

查看全部评分

回复

使用道具 举报

我的人缘0
 楼主| 宇宙小清新 2018-11-10 14:05:20 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   88% (15)
 
 
11% (2)    👎
tai扯了 发表于 2018-11-10 13:12
求问楼主 binary search我也不太明白啊 有可能不求和就能算出k么 只找到临界值的话 比budget高了多少可以算 ...

binary search解法有位层主给出了代码,就是在解可能的取值范围内用binary search取数然后拿去验证,但对于小数情况只能求到近似值。不知道有没有更好的解法惹,不过求和应该是必须的
回复

使用道具 举报

我的人缘0
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   93% (30)
 
 
6% (2)    👎
foryousee 发表于 2018/11/10 13:45:08
[mw_shl_code=java,true]public int findK(int[] salary, int budget) {
        int lo = budget / salar...

所以这个是未排序的nlogn解法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

提醒:发帖可以选择内容隐藏,部分板块支持匿名发帖。请认真读完以下全部说明:

■隐藏内容方法 - 不要多加空格: [hide=200]你想要隐藏的内容比如面经[/hide]
■意思是:用户积分低于200则看不到被隐藏的内容
■可以自行设置积分值,不建议太高(200以上太多人看不到),也不建议太低(那就没必要隐藏了)
■建议只隐藏关键内容,比如具体的面试题目、涉及隐私的信息,大部分内容没必要隐藏。
■微信/QQ/电子邮件等,为防止将来被骚扰甚至人肉,以论坛私信方式发给对方最安全。
■匿名发帖的板块和方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

手机版||一亩三分地

GMT+8, 2019-8-20 14:04

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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