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

Google 新鲜面筋

全局:

2016(1-3月) 码农类General 硕士 全职@google - 内推 - 技术电面  | | Other | 应届毕业生

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

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

x
本帖最后由 googlerr 于 2016-3-4 12:34 编辑

第一题:     给一个整数数组(可正可负可重复),返回其中任意两个元素乘积的最大值。
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
/font>
求过求Onsite



评分

参与人数 3大米 +35 收起 理由
kadimou + 10 谢谢你的介绍!
googlerr + 15 感谢分享!
Jester_Z + 10 感谢分享!

查看全部评分


上一篇:Indeed 2/17 Phone Interview
下一篇:amazon video 2/17
推荐
mrhohn 2016-3-16 05:20:15 | 只看该作者
全局:
至今不懂怎么贴代码…打扰各位了orz
  1. import java.util.*;

  2. public class MultiK {
  3.     // assume input nums is valid -> nums.length >= k
  4.     // not consider overflow
  5.     public static int multiK(int[] nums, int k) {
  6.         if (nums.length == k) {
  7.             int res = 1;
  8.             for (int n : nums) {
  9.                 res *= n;
  10.             }
  11.             return res;
  12.         }

  13.         // minHeap saves the k biggest numbers
  14.         PriorityQueue<Integer> minHeap = new PriorityQueue<>();
  15.         // maxHeap saves the k smallest numbers
  16.         PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> (b - a));
  17.         int max = Integer.MIN_VALUE;
  18.         for (int n : nums) {
  19.             max = Math.max(max, n);
  20.             // maintain minHeap and maxHeap both with k number
  21.             minHeap.offer(n);
  22.             if (minHeap.size() > k) {
  23.                 minHeap.poll();
  24.             }
  25.             maxHeap.offer(n);
  26.             if (maxHeap.size() > k) {
  27.                 maxHeap.poll();
  28.             }
  29.         }

  30.         int res = 1;
  31.         // check special cases
  32.         // if all negatives, and k is odd
  33.         // result would be negative, choose from biggest k
  34.         if (max < 0 && k % 2 == 1) {
  35.             while (!minHeap.isEmpty()) {
  36.                 res *= minHeap.poll();
  37.             }
  38.             return res;
  39.         }

  40.         // otherwise the result would be >= 0
  41.         // convert heaps to sorted list
  42.         int[] minK = new int[k];
  43.         int[] maxK = new int[k];
  44.         for (int i = k - 1; i >= 0; --i) {
  45.             minK[i] = maxHeap.poll();
  46.             maxK[i] = minHeap.poll();
  47.         }

  48.         int minPos = 0, maxPos = 0;
  49.         // if k is odd, poll the largest non-negative first
  50.         if (k % 2 == 1) {
  51.             --k;
  52.             res *= maxK[maxPos];
  53.             ++maxPos;
  54.         }
  55.         // now choose k/2 pairs out of heap
  56.         while (k != 0) {
  57.             int minPair = minK[minPos] * minK[minPos + 1];
  58.             int maxPair = maxK[maxPos] * maxK[maxPos + 1];
  59.             if (maxPair > minPair) {
  60.                 res *= maxPair;
  61.                 maxPos += 2;
  62.             }
  63.             else {
  64.                 res *= minPair;
  65.                 minPos += 2;
  66.             }
  67.             k -= 2;
  68.         }

  69.         return res;
  70.     }

  71.     public static void main(String[] args) {
  72.         int[] test1 = {-8, -7, -3, -1, 0, 5, 6, 9};
  73.         int k = 3;
  74.         System.out.println("test1: " + MultiK.multiK(test1, k));

  75.         int[] test2 = {-8, -7, -3, -1, 0, 5, 6, 9};
  76.         k = 2;
  77.         System.out.println("test2: " + MultiK.multiK(test2, k));

  78.         int[] test3 = {-8, -7, -3, -1};
  79.         k = 3;
  80.         System.out.println("test3: " + MultiK.multiK(test3, k));

  81.         int[] test4 = {1, 2, 3, 5, 6, 9};
  82.         k = 4;
  83.         System.out.println("test4: " + MultiK.multiK(test4, k));

  84.         int[] test5 = {-8, -7, -3, -1, 0, 5, 6, 9};
  85.         k = 7;
  86.         System.out.println("test5: " + MultiK.multiK(test5, k));
  87.     }
  88. }
复制代码
回复

使用道具 举报

推荐
tianlu1 2016-2-24 03:38:45 | 只看该作者
全局:
第一题O(n) non-sort解法:
keep four pointers: maximum_positive, second_max_positive, minimum_negative, second_min_negative.
回复

使用道具 举报

推荐
googlerr 2016-2-26 11:45:37 | 只看该作者
全局:
hesha0987 发表于 2016-2-26 11:42
nlogk如何得来?我有点没明白。。我想的是把n个元素放入priority_queue 为nlogn复杂度 然后pop k次为O(k) ...

应该是Queue里面只放K个元素,一个里面放最大的K个,另一个里面放最小的K个

评分

参与人数 1大米 +1 收起 理由
csgtc + 1 对对对

查看全部评分

回复

使用道具 举报

🔗
royal_916 2016-2-18 06:17:13 | 只看该作者
全局:
感觉第二题略难啊!祝lz onsite!
回复

使用道具 举报

🔗
 楼主| mwsak47 2016-2-18 06:27:05 | 只看该作者
全局:
royal_916 发表于 2016-2-18 06:17
感觉第二题略难啊!祝lz onsite!

多谢~~~~~
回复

使用道具 举报

🔗
lxy16555 2016-2-26 04:21:29 | 只看该作者
全局:
第二题可以用hashset存然后比较是否contains吧,或者用trie树查询?
回复

使用道具 举报

🔗
glad2mu 2016-2-26 06:14:24 | 只看该作者
全局:
tianlu1 发表于 2016-2-24 03:38
第一题O(n) non-sort解法:
keep four pointers: maximum_positive, second_max_positive, minimum_negati ...

我之前面过一样的题, 用的这个方法之后考官觉得有点hardcoded。 之后follow up 到求k个数的最大值。 当时没有想出比sorting 更好的算法了。。不知道k的话有没有更好算法
回复

使用道具 举报

🔗
csgtc 2016-2-26 06:22:15 | 只看该作者
全局:
glad2mu 发表于 2016-2-25 17:14
我之前面过一样的题, 用的这个方法之后考官觉得有点hardcoded。 之后follow up 到求k个数的最大值。 当 ...

k的话就用priorityqueue好了
回复

使用道具 举报

🔗
glad2mu 2016-2-26 06:27:21 | 只看该作者
全局:
csgtc 发表于 2016-2-26 06:22
k的话就用priorityqueue好了

非常感谢!
回复

使用道具 举报

🔗
hesha0987 2016-2-26 07:31:54 | 只看该作者
全局:
csgtc 发表于 2016-2-26 06:22
k的话就用priorityqueue好了

priority_queue 的复杂度和sort是一样的吧?都是nlogn。
并且priority_queue的话 需要用一个min heap 和一个max heap来确保 负数们的乘积有可能是最大的。
回复

使用道具 举报

🔗
csgtc 2016-2-26 08:13:25 | 只看该作者
全局:
hesha0987 发表于 2016-2-25 18:31
priority_queue 的复杂度和sort是一样的吧?都是nlogn。
并且priority_queue的话 需要用一个min heap 和 ...

两个priorityqueue, 复杂度并不是sort的nlogn,而是nlogk 速度肯定比sort快
回复

使用道具 举报

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

本版积分规则

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