一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
码农求职神器Triplebyte:
不用海投,内推你去多家公司面试
Airbnb 数据科学职位
in analytics and inference
天天打游戏、照样领工资,
你要不要来?
把贵司招聘信息放这里
查看: 1578|回复: 17
收起左侧

nest 电面

[复制链接] |试试Instant~ |关注本帖
documentary1 发表于 2017-7-12 05:09:28 | 显示全部楼层 |阅读模式

2017(7-9月) 码农类 硕士 全职@Google - 内推 - 技术电面 |Other在职跳槽

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

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

x
Write a function. . From 1point 3acres bbs
Input: int[] that is sorted
Output: A int value from the int[]. Where the value occurs in the array at least (length of array / 4) times
Example: [1, 2, 3, 4, 1, 6, 7, 2]. Length of array is 8. 8/4 = 2. Return item that occurs at least 2 times. Return value 1 or 2.

if sorted
要求不断优化,o(n) space o(n) time -> o(1) space o(n) time -> o(1) space o(logn) time



评分

1

查看全部评分

codemonk 发表于 2017-8-24 14:13:39 | 显示全部楼层
  1. // O(k*N) time, O(k) space, here k = 4
  2. vector<int> majorityElements(vector<int>& nums, int k = 4) {. 1point3acres.com/bbs
  3.     int n = nums.size();. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  4.     vector<int> ans;
  5.     vector<int> cand(k, 0), freq(k, 0);
  6.     iota(cand.begin(), cand.end(), 0);
  7.     for(int num : nums) {
  8.         bool match = false; // check if there is a match with existing candidate
  9.         for(int i = 0; i < k; i++) {
  10.             if(num == cand[i]) {
  11.                 freq[i]++;
  12.                 match = true;.1point3acres缃
  13.                 break;
  14.             }
  15.         }
  16.         if(!match) { // no match with existing candidate
  17.             for(int i = 0; i < k; i++) {
  18.                 if(freq[i] == 0) { // we can replace with num a candidate with freq = 0
  19.                     freq[i] = 1;
  20.                     cand[i] = num;
  21.                     break;
  22.                 }
  23.                 if(i == k) { // no match and no replacement
  24.                     for(int i = 0; i < k; i++) freq[i]--; // freq[] all reduce by 1
  25.                 }
  26.             }
  27.         }
  28.     }
  29.     for(int c : cand) {. visit 1point3acres.com for more.
  30.         if(count(nums.begin(), nums.end(), c) >= ceil(n/4))
  31.             ans.push_back(c); // if c is with freq > n/4;
  32.     } 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  33.     return ans;
  34. }

  35. // O(logN) time, O(1) space
  36. // only need to check if nums at indices n/4-1, 2*n/4-1, 3*n/4-1, n-1 are qualified candidate.
  37. vector<int> majorityElementsBinarySearch(vector<int>& nums) {
  38.     unordered_set<int> cand;
  39.     int n = nums.size();
  40.     cand.insert(nums[n/4-1]);
  41.     cand.insert(nums[2*n/4-1]);
  42.     cand.insert(nums[3*n/4-1]);
  43.     cand.insert(nums[n-1]);. 1point3acres.com/bbs
  44.     vector<int> ans;
  45.     for(int c : cand) {
  46.         int range = upper_bound(nums.begin(), nums.end(), c) - lower_bound(nums.begin(), nums.end(), c);
  47.         if(range >= n/4) ans.push_back(c);
  48.     }
  49.     return ans;
  50. }

  51. int main(int argc, const char * argv[]) {
  52.     // insert code here...
  53.     vector<int> nums1 = {1,1,2,2,3,3,4,4};
  54.     auto ans = majorityElements(nums1);. visit 1point3acres.com for more.
  55.     for(int i : ans) cout << i << " ";
  56.     cout << endl;
  57.    
  58.     vector<int> nums2 = vector<int>({0,1,1,1,2,2,3,3,3,4,4,5});
  59.     ans = majorityElements(nums2);
  60.     for(int i : ans) cout << i << " ";
  61.     cout << endl;. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  62.    
  63.     ans = majorityElementsBinarySearch(nums1);
  64.     for(int i : ans) cout << i << " ";
  65.     cout << endl;
  66.    
  67.     ans = majorityElementsBinarySearch(nums2);
  68.     for(int i : ans) cout << i << " ";
  69.     cout << endl;
  70.     return 0;
  71. }
复制代码
回复 支持 2 反对 0

使用道具 举报

2011051305 发表于 2017-7-14 23:57:10 | 显示全部楼层
rgc588 发表于 2017-7-14 11:31
舍弃的逻辑是什么? 还是没想出来

. From 1point 3acres bbs我想是二分的话 一定有一半不合要求的嘛  题主的题意是sorted array的 所以一次二分就是O(logn)  像merge sort这种最终要对所有array element做处理的 才是O(nlogn)

如果说错了求批判~~
回复 支持 1 反对 0

使用道具 举报

Timothy1119 发表于 2017-7-12 05:34:50 | 显示全部楼层
非常感谢分享!能具体说一下优化的过程吗?是针对sorted array进行优化吗?最后怎么做到logn的时间的?
回复 支持 反对

使用道具 举报

2011051305 发表于 2017-7-12 06:06:21 | 显示全部楼层
是肯定给定了sorted了吗? o(n) space o(n) time 用Hashmap扫一遍计数 ->  o(1) space o(n) time 用一个int记录当前指针 然后双指针扫一遍 -> 用二分查找 mid的左边右边分别查看 因为只要返回value就好无所谓index ? 这个思路是对的么?
回复 支持 反对

使用道具 举报

星焦不变 发表于 2017-7-12 06:42:28 | 显示全部楼层
请问楼主申请的是什么岗位啊?
回复 支持 反对

使用道具 举报

rainbow767 发表于 2017-7-12 08:59:05 | 显示全部楼层
2011051305 发表于 2017-7-11 14:06
是肯定给定了sorted了吗? o(n) space o(n) time 用Hashmap扫一遍计数 ->  o(1) space o(n) time 用一个int ...

用二分查找 mid的左边右边分别查看 因为只要返回value就好无所谓index?这个我不太理解。能讲讲是什么意思吗?为何要看mid啊?
回复 支持 反对

使用道具 举报

say543 发表于 2017-7-12 13:35:46 | 显示全部楼层
楼主能问下logn 怎么解吗 感觉二分查找 也是要o(nlogn)?
回复 支持 反对

使用道具 举报

FightForTomo 发表于 2017-7-12 13:54:14 | 显示全部楼层
say543 发表于 2017-7-12 13:35
楼主能问下logn 怎么解吗 感觉二分查找 也是要o(nlogn)?

二分查找要是都nlgn了,直接遍历不就行了。
回复 支持 反对

使用道具 举报

FightForTomo 发表于 2017-7-12 13:57:43 | 显示全部楼层
不是说好input 是排序的了么。
例子咋又乱序了?

我觉得就直接遍历,然后maintain 一个counter. . 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
返回最常出现的数字就可以了。
时间O(n), 空间O(1)。
回复 支持 反对

使用道具 举报

rgc588 发表于 2017-7-14 02:37:11 | 显示全部楼层
2011051305 发表于 2017-7-12 06:06
是肯定给定了sorted了吗? o(n) space o(n) time 用Hashmap扫一遍计数 ->  o(1) space o(n) time 用一个int ...
.1point3acres缃
如果两边都找那不是logN 只搜索一边才是logN
回复 支持 反对

使用道具 举报

2011051305 发表于 2017-7-14 03:50:53 | 显示全部楼层
rgc588 发表于 2017-7-14 02:37. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
如果两边都找那不是logN 只搜索一边才是logN

恩我是想说  如果二分+左右探查 其实可能会退化成O(n)的 所以应该是一次二分才能做到O(logn)  注意上面同学说的二分查找也是要O(nlogn) 其实是不准确的 因为这里是sorted 所以每次都一定能舍弃一半 。   (说错了大家请指正!~)

回复 支持 反对

使用道具 举报

rgc588 发表于 2017-7-14 11:31:05 | 显示全部楼层
2011051305 发表于 2017-7-14 03:50
恩我是想说  如果二分+左右探查 其实可能会退化成O(n)的 所以应该是一次二分才能做到O(logn)  注意上面同 ...

舍弃的逻辑是什么? 还是没想出来
回复 支持 反对

使用道具 举报

xjob2017spring 发表于 2017-7-14 13:06:11 | 显示全部楼层
路过问一下nest和g招人是互相独立的吗
回复 支持 反对

使用道具 举报

sjtuenergy 发表于 2017-7-17 11:36:07 | 显示全部楼层
楼主收到onsite通知了吗? thanks
回复 支持 反对

使用道具 举报

f1371342385 发表于 2017-7-23 07:04:36 | 显示全部楼层
2011051305 发表于 2017-7-14 23:57
我想是二分的话 一定有一半不合要求的嘛  题主的题意是sorted array的 所以一次二分就是O(logn)  像merge ...

求问这个舍弃的逻辑是什么?没太想明白
回复 支持 反对

使用道具 举报

mchzh 发表于 2017-7-26 13:30:33 | 显示全部楼层
除了做题还问别的问题吗?楼主得到onsite了吗?
回复 支持 反对

使用道具 举报

linixtest 发表于 2017-8-26 07:56:00 | 显示全部楼层
把array切成四等份,看某一个区间里面最前面和最后面的数字是不是相等?
. From 1point 3acres bbs
补充内容 (2017-8-26 08:00):. visit 1point3acres.com for more.
没有的话再移除1.3的那两刀,看看中间有没有。如果还没有就移除最中间的那一刀,看看中间有没有。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

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

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2017-12-11 10:25

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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