12
返回列表 发新帖
楼主: msu_HIDDEN
跳转到指定楼层
上一主题 下一主题
收起左侧

Google电面面经 估计一轮游2016

🔗
 楼主| msu_HIDDEN 2016-3-28 09:46:42 | 只看该作者
全局:
hison7463 发表于 2016-3-28 08:42
感觉这题和leetcode上的major element是一个解法的

不太一样。。。这题要求的是popular element 的出现次数
回复

使用道具 举报

🔗
dimi 2016-3-28 10:04:18 | 只看该作者
全局:
切成4分,
头尾是candidates。一共有8个,
然後从小開始測試。
这满足要求么
回复

使用道具 举报

🔗
 楼主| msu_HIDDEN 2016-3-28 10:16:36 | 只看该作者
全局:
dimi 发表于 2016-3-28 10:04
切成4分,
头尾是candidates。一共有8个,
然後从小開始測試。

要怎么测试呢?
回复

使用道具 举报

🔗
cervantes 2016-3-28 11:21:59 | 只看该作者
全局:
Array时sort好了的,所以大于1/4 的元素只可能出现在1/4,1/2,3/4处,分别对这三处的数检测。检测方法就是binary search 找出出现的最左边的index,和最右边的index,index之差就是frequence。如果超过1/3 加入到结果里
回复

使用道具 举报

🔗
bobzhang2004 2016-3-29 21:52:47 | 只看该作者
全局:
请问楼主有结果了吗?面完几天后有结果呢?
回复

使用道具 举报

🔗
 楼主| msu_HIDDEN 2016-4-26 01:59:50 | 只看该作者
全局:
bobzhang2004 发表于 2016-3-29 21:52
请问楼主有结果了吗?面完几天后有结果呢?

妥妥被拒啊
回复

使用道具 举报

🔗
DaveLiu 2016-6-7 12:17:28 | 只看该作者
全局:
大致写了一下,不知道有没有cover不到的corner case:

  1. class PopularItemInSortedArray {
  2.         public int pupularItem(int[] nums) {
  3.                 int seg = nums.length / 4;
  4.                 for (int i = seg; i < nums.length; i += seg) {
  5.                         int first = findFirst(nums[i], 0, i - 1, nums);
  6.                         if (first == -1) first = i;
  7.                         int last = findLast(nums[i], i + 1, nums.length - 1, nums);
  8.                         if (last == -1) last = i;
  9.                         if (last - first + 1 >= seg) {
  10.                                 return nums[i];
  11.                         }
  12.                 }
  13.                 return -1;
  14.         }
  15.        
  16.         private int findFirst(int t, int s, int e, int[] nums) {
  17.                 while (s <= e) {
  18.                         int m = s + (e - s) / 2;
  19.                         if (nums[m] == t && (nums[m - 1] != t || nums[m + 1] != t)) {
  20.                                 return m;
  21.                         } else if (nums[m] < t) {
  22.                                 s = m + 1;
  23.                         } else {
  24.                                 e = m - 1;
  25.                         }
  26.                 }
  27.                 return -1;
  28.         }
  29.        
  30.         private int findLast(int t, int s, int e, int[] nums) {
  31.                 while (s <= e) {
  32.                         int m = s + (e - s) / 2;
  33.                         if (nums[m] == t && (nums[m - 1] != t || nums[m + 1] != t)) {
  34.                                 return m;
  35.                         } else if (nums[m] > t) {
  36.                                 e = m - 1;
  37.                         } else {
  38.                                 s = m + 1;
  39.                         }
  40.                 }
  41.                 return -1;
  42.         }
  43.          
  44.         public static void main(String[] args) {
  45.                 PopularItemInSortedArray p = new PopularItemInSortedArray();
  46.                 System.out.println(p.pupularItem(new int[]{1, 2, 2, 2, 3, 3, 3, 4, 5, 5, 5, 5, 5, 5, 5, 6}));
  47.         }
  48. }
复制代码
回复

使用道具 举报

🔗
robinali 2016-6-7 13:01:05 | 只看该作者
全局:
感觉楼主没有问前提: 是否sorted?
嗯,确实是binary search比较快。
回复

使用道具 举报

🔗
chaohubian 2018-10-18 12:28:02 | 只看该作者
全局:
DaveLiu 发表于 2016-6-7 12:17
大致写了一下,不知道有没有cover不到的corner case:

19 和 32 行有bug

  1.         public int popularItem(int[] nums) {
  2.                 if(nums ==null || nums.length<4) {
  3.                         return 0;
  4.                 }
  5.                 int seg = nums.length/4;
  6.                 for(int i=seg; i<nums.length; i+=seg) {
  7.                         int first = findFirst(nums[i], 0, i-1, nums);
  8.                         if(first == -1)        first = i;
  9.                         int last = findLast(nums[i], i+1, nums.length-1, nums);
  10.                         if(last == -1) last = i;
  11.                         if(last - first + 1 >= seg) {
  12.                                 return nums[i];
  13.                         }
  14.                 }
  15.                 return -1;
  16.         }
  17.        
  18.         private int findFirst(int t, int s, int e, int[] nums) {
  19.                 while(s<=e) {
  20.                         int m = s + (e-s)/2;
  21.                         if(nums[m] == t && (m==0 || nums[m-1]!=t || nums[m+1]!=t)) {
  22.                                 return m;
  23.                         } else if(nums[m]<t) {
  24.                                 s = m + 1;
  25.                         } else {
  26.                                 e = m - 1;
  27.                         }
  28.                 }
  29.                 return -1;
  30.         }
  31.        
  32.         private int findLast(int t, int s, int e, int[] nums) {
  33.                 while(s<=e) {
  34.                         int m = s + (e-s)/2;
  35.                         if(nums[m] == t && (nums[m-1]!=t || m+1==nums.length || nums[m+1]!=t)) {
  36.                                 return m;
  37.                         } else if(nums[m] > t) {
  38.                                 e = m - 1;
  39.                         } else {
  40.                                 s = m + 1;
  41.                         }
  42.                 }
  43.                 return -1;
  44.         }
复制代码
回复

使用道具 举报

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

本版积分规则

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