记 今日头条广告架构社招面试

部门是广告下架构部门,主要偏广告日志处理方面;

之前面试过头条财经业务部,其面试题基本以常见算法题和leetcode原题的形式出现,而头条广告部门的算法面试题基本是开放性算法题,更加注重对数据结构算法的理解及运用、以及问题转化为数据结构算法解决方案的反应速度,简单说就是,侧重对"内功"的考察;

一面:确切说还有第0面,上去连简历都完全不看(确切说是没有),直接白纸出一道题,给一刻钟时间解答,答对再进入正式的一面;

面试题:医院有M个医生,需要做的手术的手术时间用一个数组来描述,比如第2分钟、第5分钟、第8分钟等等,要求写一个函数,返回每一个手术由哪个医生做,要尽可能安排合理,即避免发生有的医生做很多手术有的医生一直在闲置的情况;

当时看见有点蒙,后来想到了个办法是用堆,创建一个类struct worker {int docid; int endtime;}描述每个手术的医生和手术结束时间,并重载<运算符,以手术结束时间endtime为判断大小的小顶堆;对于第1-M个手术,就创建一个这样的类实例并放入堆,并返回医生id(1-M);当M个手术即处理第M + 1个手术时,找堆顶返回该医生id,创建新手术元素push到堆,并判断如果当前时间和堆顶元素的endtime,当前时间就是当前手术是第几分钟开始即数组元素里的时间,如果当前时间大于endtime,则还要pop掉堆顶元素;该方法及代码得到面试者同意;

然后问了问项目,项目问的细致程度一般,问了问c++一些基础等等;


二面:二面也是先一道题,然后一道题,然后问项目和基础;

第1题:有一个N面的骰子,每一面出现的概率已知,要求写一个函数返回每次投掷结果,要反映各面的概率;

想了想发现用区间比较好解决,因为所有面的概率之和为1,那么创建一个类struct interval {int value; double start;}并放入vector描述骰子各面出现的范围,然后每次投掷用随机函数生成0-1的浮点数,并判断浮点数落在哪个范围,判断方式就是判断第一个大于浮点数的vector的元素(stl的lower_bound)即可;该方法貌似不是面试者预想到的解决方法,但也得到了认可,然后他又来一道题;

第2题:想喝N瓶酒,每K个空瓶换一瓶新酒,问需要几瓶;

此题相对大众一些,直接用递归加剪枝实现;问还有没有更好的方法,然后他发现我正在写动态规划时直接叫停,说不用写了;

然后问项目,二面明显问的较细,包括分布式容灾、多节点数据同步等方面,以及一些工作以外之类,问的都比较细致;


总结:刷题的目的,不(仅)是指望面试时出现原题或简单变换后近似的题,而是逐渐潜移默化,培养出一种”内功“,形成对普遍的数据结构算法的深刻认识和场景运用,理解的越熟越深刻,反应就越快,而且思路也越多且靠谱;这不仅是面试管用,平时工作遇到这种局部问题需要解决时,也多多少少有一些益处;

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值