回复: 39
跳转到指定楼层
上一主题 下一主题
收起左侧

Google面经——一道可能被大家低估的题

 
全局:

2016(7-9月) 码农类General 硕士 全职@google - 内推 - Onsite  | | Fail | 应届毕业生

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

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

x
别的题太水,懒得写了。
只说一个被大家忽视的题,也可能是我这次挂的原因。

这题是简化债务关系,就是给一堆人的账面交易记录,求最少交易次数使得账面平衡。

这题一般有两个思路,一个是把一
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies


第二次被狗家拒,从上海到美国,可能这辈子都不会去Google了。希望下次大家看到这题看到这题能够有所帮助,祝大家好运!

评分

参与人数 4大米 +19 收起 理由
kiru + 5 加油
omega094 + 1 感谢分享题目!楼主会有好offer的!!
siriuswang + 3 感谢分享!
muybienw + 10 感谢分享!

查看全部评分


上一篇:LinkedIn电面面经
下一篇:Coursera OA2 是“1.5-hour programming project”吗?多谢!

本帖被以下淘专辑推荐:

推荐
virpro 2016-10-6 01:07:10 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

推荐
 楼主| 南慕伦 2016-9-17 01:56:11 | 只看该作者
全局:
这题的做法就是,算清各自应得/应付账款之后,分为正数负数两个集合,0扔掉,然后在正数里面找最小的子集,负数里面找另一个子集,使得存在两个不等于全集的子集,他们的和是相反数,然后合并这两个集合,这样一定是最优的。而找子集的过程就是subset sum,目前看只能穷举,要是你多项式时间做出来,那就图灵奖了。
回复

使用道具 举报

推荐
lzb700m 2016-9-22 02:01:32 | 只看该作者
全局:
lzb700m 发表于 2016-9-16 21:30
是N角债问题吗?N个人有欠钱的,有借钱的,但是总体balance是0。问最少多少次交易可以让所有人不欠钱也不被 ...

写了一个,可以这样搜。
  1.         class Balance {
  2.                 int level;
  3.                 List<Integer> lender;
  4.                 List<Integer> borrower;

  5.                 Balance(int level, List<Integer> posVals, List<Integer> negVals) {
  6.                         this.level = level;
  7.                         lender = posVals;
  8.                         borrower = negVals;
  9.                 }

  10.                 public List<Balance> payOnce() {
  11.                         List<Balance> ans = new ArrayList<>();
  12.                         for (int i = 0; i < lender.size(); i++)
  13.                                 for (int j = 0; j < borrower.size(); j++) {
  14.                                         int pos = lender.get(i);
  15.                                         int neg = borrower.get(j);
  16.                                         List<Integer> newLender = new ArrayList<>(lender);
  17.                                         List<Integer> newBorrower = new ArrayList<>(borrower);
  18.                                         newLender.remove(i);
  19.                                         newBorrower.remove(j);

  20.                                         int diff = pos + neg;
  21.                                         if (diff > 0)
  22.                                                 newLender.add(pos + neg);
  23.                                         else if (diff < 0)
  24.                                                 newBorrower.add(pos + neg);

  25.                                         ans.add(new Balance(level + 1, newLender, newBorrower));
  26.                                 }
  27.                         return ans;
  28.                 }

  29.                 public boolean balanced() {
  30.                         return lender.isEmpty() && borrower.isEmpty();
  31.                 }

  32.                 public String toString() {
  33.                         return borrower.toString() + ", " + lender.toString()
  34.                                         + ", # of payments: " + level;
  35.                 }
  36.         }

  37.         public int pay(int[] paid) {
  38.                 int n = paid.length;
  39.                 long total = 0;
  40.                 for (int amount : paid) {
  41.                         total += amount;
  42.                 }
  43.                 if (total % n != 0)
  44.                         throw new IllegalArgumentException(
  45.                                         "Total amount can not be evenly divided.");
  46.                 int avg = (int) total / n;

  47.                 List<Integer> pos = new ArrayList<>();
  48.                 List<Integer> neg = new ArrayList<>();
  49.                 for (int amount : paid) {
  50.                         int diff = amount - avg;
  51.                         if (diff > 0)
  52.                                 pos.add(diff);
  53.                         else if (diff < 0)
  54.                                 neg.add(diff);
  55.                 }

  56.                 Balance initialBalance = new Balance(0, pos, neg);
  57.                 Queue<Balance> queue = new LinkedList<>();
  58.                 queue.offer(initialBalance);
  59.                 int ans = Integer.MAX_VALUE;
  60.                 while (true) {
  61.                         Balance cur = queue.poll();
  62.                         System.out.println(cur);
  63.                         if (cur.balanced()) {
  64.                                 ans = cur.level;
  65.                                 break;
  66.                         }
  67.                         List<Balance> nextLevel = cur.payOnce();
  68.                         for (Balance newBalance : nextLevel)
  69.                                 queue.offer(newBalance);
  70.                 }

  71.                 return ans;
  72.         }
复制代码
回复

使用道具 举报

🔗
wtcupup 2016-9-16 13:06:58 | 只看该作者
全局:
楼主能具体说说这道题的输入是什么?用什么数据结构表示这些人的交易记录呢?
回复

使用道具 举报

🔗
 楼主| 南慕伦 2016-9-16 13:33:46 | 只看该作者
全局:
wtcupup 发表于 2016-9-16 13:06
楼主能具体说说这道题的输入是什么?用什么数据结构表示这些人的交易记录呢?

三元组吧
(a, b, v)
账面交易a需要给b v元
回复

使用道具 举报

🔗
hulahu 2016-9-16 13:52:46 | 只看该作者
全局:
坐等大牛们的code
回复

使用道具 举报

🔗
siriuswang 2016-9-16 14:11:05 | 只看该作者
全局:
请问楼主,这是什么意思?“找到两个不相交的最小子集,使得二者刚好能够结余。” 能举个例子吗?
回复

使用道具 举报

🔗
wenzhu 2016-9-16 14:54:59 | 只看该作者
全局:
马克。没思路...
回复

使用道具 举报

🔗
constancelee 2016-9-16 14:59:26 | 只看该作者
全局:
马。坐等大牛
回复

使用道具 举报

🔗
leonardcohen 2016-9-16 18:20:54 | 只看该作者
全局:
LZ, do you mind share the details about this 第二次被狗家拒,从上海到美国,可能这辈子都不会去Google了?
回复

使用道具 举报

🔗
hxtang 2016-9-16 19:32:29 | 只看该作者
全局:
这个题当时要求实现找minimal transaction的算法吗,还是先讲一个naive的,minimal transaction的聊聊就好...
不过纠结于subset sum是NPC就据了,觉得挺过分的啊...
回复

使用道具 举报

🔗
zsj2725 2016-9-16 20:23:51 | 只看该作者
全局:
siriuswang 发表于 2016-9-16 14:11
请问楼主,这是什么意思?“找到两个不相交的最小子集,使得二者刚好能够结余。” 能举个例子吗?

应该是指能够结清吧
类似(a,b,1) + (b,a,1)
或者 (a,b,2)+(b,c,2)+(c,a,2)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

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