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

Google 前端 onsite

全局:

2016(7-9月) 码农类General 硕士 全职@google - 内推 - Onsite  | | Other | 在职跳槽

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

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

x
看见地里面gg前端的很少,特来贡献,希望能帮助大家,壮大前端队伍。求米~
共5轮,1轮纯算法,4轮JavaScript

第一轮:算法

给出 wifi 发射点的覆盖距离,和一些 1D 的房子坐标,求需最少要几个 wifi 发射点(one pass 就能解出来)
follow up:给出最多可以安装的发射点的数量,求发射点最覆盖距离(用房子总长除以发射点数量得到最大覆盖距离,用二分法套到第一个解写出来的函数里不断尝试从1到最大覆盖)

第二轮:

第一题:上了一段写的很烂的代码,让你简化,把一些
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
都可以做。懒得设计 stack 怎么存了,就用了 recursion。

感觉谷歌对细节的要求很高。出题做起来很容易在小地方犯错误导致出不来。偏算法。面试官不太爱说话,场面有时候会很尴尬……也不知道是对了还是错了。还没出结果,答案不能用来参考嘿嘿

谢谢大家,求米!

评分

参与人数 3大米 +13 收起 理由
dearsheep + 2 给你点个赞!
史考特 + 1 很有用的信息!
ytsr + 10 很有用的信息!

查看全部评分


上一篇:10/7 Amazon OA2
下一篇:亚麻oa2 10月5号 面筋

本帖被以下淘专辑推荐:

推荐
qingmo 2016-11-12 05:07:43 | 只看该作者
全局:
再次谢谢楼主的经验贴,在这贴一下当时准备面试的时候准备的第四轮的代码
(假定只存在tagName, ID, class三种情况,因为45分钟如果能把特殊情况都考虑进去的话我觉得有点假。。。)
比如如果是selector_str   = 'div#main p p.red span'
因为浏览器解析selector是从右到左的,所以我的思路是先找到最右的selector,找出所有满足的结果-即先找出所有的span元素
然后根据浏览器解析的原则进行dfs,找出满足条件的元素,即他们的parent element能满足前一个selector - 看找出的span元素的父节点是否有满足p.class 的,如果有,继续向上dfs
最后返回dfs后的元素

  1. var SELECTOR = function (selector, node) {
  2.     node = node || document;
  3.     var fns, getBySingleSelector, res;

  4.     //check if the selector is valid
  5.     if (typeof selector !== 'string') return [];

  6.     selector = selector.split(' '); //[#main, li.selected a]

  7.     fns = {
  8.         id: function (sel) {
  9.             return document.getElementById(sel); //return an Element Object
  10.         },
  11.         get: function (c_or_e, sel, par) {
  12.             par = par || document;
  13.             var i, len, temp,
  14.                 arr = [],
  15.                 get_what = (c_or_e === 'class') ? 'getElementsByClassName' : 'getElementsByTagName';
  16.             //parent - node, nodeList, dom

  17.             if (par.length > 1) {
  18.                 i = 0;
  19.                 len = par.length;
  20.                 while (i < len) {
  21.                     temp = par[i++][get_what](sel);
  22.                     Array.prototype.push.apply(arr, Array.prototype.slice.call(temp)); //because temp is an object
  23.                 }
  24.             } else {
  25.                 arr = par[get_what](sel); //?
  26.             }

  27.             return arr;
  28.         },
  29.         eleFilter: function(c_or_e, sel, arr){
  30.             if(arr === null || arr.length === 0) return arr;
  31.             var i,ele,
  32.                 isClass,
  33.                 len = arr.length,
  34.                 res = [];

  35.             isClass = c_or_e === 'class' ? true : false

  36.             for(i = 0; i < len; i++){
  37.                 ele = arr[i];
  38.                 if((isClass&&ele.className.indexOf(sel) !== -1) || (!isClass && ele.nodeName === sel.toUpperCase()))
  39.                     res.push(ele);
  40.             }

  41.             return res;
  42.         },
  43.         eleValid: function(sel, node){
  44.             if(sel === null || sel.length === 0) return true;

  45.             if(sel.indexOf('#') > -1){
  46.                 sel = sel.split('#');
  47.                 if(fns.id(sel[1]) !== node) return false;
  48.                 if(sel[0].length > 0 && node.nodeName !== sel[0].toUpperCase()) return false;
  49.             }else if(sel.indexOf('.') > -1){
  50.                 sel = sel.split('.');
  51.                 var i = 1, len = sel.length;
  52.                 for(i; i < len; i++){
  53.                     if(node.className.indexOf(sel[i]) === -1) return false;
  54.                 }
  55.                 if(sel[0].length > 0 && node.nodeName !== sel[0].toUpperCase()) return false;
  56.             }else{
  57.                 return node.nodeName === sel.toUpperCase();
  58.             }

  59.             return true;
  60.         }
  61.     };

  62.     getBySingleSelector = function(sel){
  63.         var res = [], rep, i, len;
  64.         if(sel === null || sel.length === 0 || typeof sel !== 'string') return [];
  65.         if(sel.indexOf('#') > -1){
  66.             sel = sel.split('#');
  67.             rep = fns.id(sel[1]);
  68.             if(sel[0].length > 0 && rep.nodeName !== sel[0].toUpperCase()) rep = null;
  69.             res.push(rep);
  70.         }else if(sel.indexOf('.') > -1){
  71.             sel = sel.split('.');
  72.             len = sel.length;
  73.             res = fns.get('class',sel[1]);
  74.             for(i = 2; i < len; i++){
  75.                 res = fns.eleFilter('class',sel[i],res);
  76.                 if(res.length === 0) break;
  77.             }
  78.             if(res.length > 0 && sel[0].length > 0){
  79.                 res = fns.eleFilter('tag',sel[0],res);
  80.             }
  81.         }else{
  82.             res = fns.get('tag', sel);
  83.         }


  84.         return res;
  85.     };



  86.     function dfs(node, curNode, res, selectors, index){
  87.         if(index === -1){
  88.             if(curNode !== document && res.indexOf(node) === -1) res.push(node);
  89.             return;
  90.         }

  91.         if(curNode === document) return;

  92.         var sel = selectors[index];
  93.         if(fns.eleValid(sel, curNode)){
  94.             dfs(node, curNode.parentNode, res, selectors, index-1);
  95.         }else{
  96.             dfs(node, curNode.parentNode, res, selectors, index);
  97.         }
  98.     }

  99.     function genFinalRes(input,selector){
  100.         if(selector.length < 2) return input;
  101.         var res = [];
  102.         for(var i = 0; i < input.length; i++){
  103.             var node = input[i];
  104.             dfs(node, node.parentNode, res, selector,selector.length-2);
  105.         }

  106.         return res;

  107.     }


  108.     res = genFinalRes(getBySingleSelector(selector[selector.length-1]),selector);

  109.     return res;

  110. };
复制代码



参考了https://code.tutsplus.com/tutorials/building-a-simple-css-selector-engine--net-16389
https://github.com/jquery/sizzle
回复

使用道具 举报

🔗
伤的彻底 2016-10-8 09:47:46 | 只看该作者
全局:
第一题WIFI覆盖是半径吗?如果是一个圆的话求one pass的思路!
回复

使用道具 举报

🔗
qingmo 2016-10-8 10:34:01 | 只看该作者
全局:
谢谢楼主,实在是太有用啦~~~楼主早点有好消息哈~~
回复

使用道具 举报

🔗
ytsr 2016-10-8 13:57:50 | 只看该作者
全局:
伤的彻底 发表于 2016-10-8 09:47
第一题WIFI覆盖是半径吗?如果是一个圆的话求one pass的思路!

lz说了是1D的
回复

使用道具 举报

🔗
 楼主| AD0103 2016-11-12 11:19:31 | 只看该作者
全局:
qingmo 发表于 2016-11-12 05:07
再次谢谢楼主的经验贴,在这贴一下当时准备面试的时候准备的第四轮的代码
(假定只存在tagName, ID, class ...

赞一个!
回复

使用道具 举报

🔗
Will5 2016-11-16 04:53:47 | 只看该作者
全局:
谢谢分享,赞。。
回复

使用道具 举报

🔗
zchang3 2017-3-15 09:06:33 | 只看该作者
全局:
算法必须用js写吗?
回复

使用道具 举报

🔗
f1371342385 2017-4-9 07:18:58 | 只看该作者
全局:
LZ 第一题的follow up能不能给出更多的detail 感谢
回复

使用道具 举报

🔗
dianek 2017-4-9 10:58:15 | 只看该作者
全局:
f1371342385 发表于 2017-4-9 07:18
LZ 第一题的follow up能不能给出更多的detail 感谢

我觉得follow up的意思是,已知房子的坐标[x1, x2, x3, ...xn],然后和可以安装的最多的wifi 发射点数目max,求wifi发射点的最小覆盖距离 d。
思路是,1. 安装最多的WiFi发射点 max,能保证wifi发射点的覆盖距离d最小。
2. 然后安装max 个WiFi发射点情况下,当dmax = (xn - x1) / max时候,只有WiFi发射点均匀分布,就能覆盖所有的房子
3. 但是步骤2的dmax是最差情况,所有我们可以用二分法[1, dmax], 求得当前的d,只要d满足能够覆盖所有的房子,我们就寻找下一个更小的d,知道找到刚刚好覆盖所有房子的最小的覆盖距离。

这一题有个疑问就是,不断二分后,可能最终要迭代很多次后,比如wifi覆盖距离被缩短到[5.1, 5.11]类似这样的范围,这时候要找个方法来终止迭代
回复

使用道具 举报

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

本版积分规则

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