本文翻译自Google工程师/面试官Alex Golec的文章:Google Interview Questions Deconstructed: The Knight’s Dialer;

来源:实验楼,翻译:实验楼扫地阿姨

原文:https://medium.com/@alexgolec/google-interview-questions-deconstructed-the-knights-dialer-f780d516f029

作为一名Google的工程师和面试官,今天是我第二次发文分享科技公司面试建议了。这里先声明:本文仅代表我个人的观察、意见和建议。请勿当作来自Google或Alphabet的官方建议或声明。

下面这个问题,是我面试生涯中第一个问题;也是第一个被泄漏出来,以及第一个被禁掉的问题。我喜欢这个问题,因为它有以下优点:

  • 问题很容易表述清楚,也容易理解。

  • 这个问题有多个解。每个解都需要不同程度的算法和数据结构知识。而且,还需要一点点远见。

  • 每个解都可以简单几行代码实现,非常适合有时间限制的面试。

如果你是学生,或者求职者,我希望你通过本文能够了解到,面试问题一般会是怎么样的。如果你也是面试官,我很乐意分享自己在面试中的风格和想法,如何更好地传达信息、征求意见。

注意,我将使用Python写代码;我喜欢Python因为它易学,简洁,而且有海量的标准库。我遇到的很多面试者也很喜欢,尽管我们推行“不限定语言”的政策,我面试90%的人都用Python。而且,我用的Python 3因为,拜托,这都2018年了。

问题

现在,假设你拨号只能像棋子一样走“L”形状。每走完一个“L”形拨一次号,起始位置也算拨号一次。问题:从某点开始,在N步内,你可以拨到多少不同的数字?

讨论

每次面试,我基本都会分成两个部分:首先我们找出算法方案,然后让面试者在代码中实现。我说“我们找出算法方案”,因为这个过程我不是沉默的独裁者。在这样高压下,设计并实现一种算法,45分钟时间并不算充足。

有一点我想强调一下,重要的很:作为面试官,我的职责可不是坐那看着大家失败搞砸。我想要给大家正面的反馈,给大家机会去展现大家最擅长的点。给他们提示,就像是在说:呐,这一步路我给你铺上,但这只是为了让你展示给我,你在后面的路上能走的更远。

当听完面试官的问题,你应该做什么?切记不要立刻就去写代码,而是在黑板上试着一步一步去分解问题。分解问题能够帮助你寻找到规律,特例等等,逐渐在大脑中形成解决方案。比如,你现在从数字6开始走,能走2步,会有如下组合:怎么样?你脑海里有方案了吗?第0阶:到达下一步

使用这个问题面试,最让我惊讶的是,太多人都卡在了计算从某个特定点跳出时,一共有多少种可能,即邻Neighbors。我的建议是:当你不确定时,先写个占位符,然后请求面试官能否晚点实现这一部分。

而且,如果一个问题的复杂性不在这里,你也可以问我能不能先略过,一般我都是允许的。我倒是不介意面试者不知道问题的复杂性在哪里,尤其刚开始他们还没有全面了解问题的时候。

第1阶:递归

聪明的你可能注意到了,这个问题可以通过枚举出所有符合条件的数字,然后计算。这里可以使用递归产生这些值:

这个方法可以,而且是在面试中最普遍的方法。但是请注意,我们产生了这么多数字却并没有使用他们,我们计算完他们的个数后,就再也不去碰了。所以我建议大家遇到这种情况,尽量去想一下看有没有更好的方案。第2阶:数不数数

怎么在不产生这些数字的情况下计算出个数?可以做到,但需要一点点机智。注意从特定点跳出N次能够拨到的数字个数,等于从它所有临近的点跳出N-1次能够拨到的数字个数的总和。我们可以表达为这样的递归关系:

如果你这样想,就会很直观了,跳一次时:6有3个neighbors(1,7和0),当跳0次时每个数字本身算一次,因此每次你只能拨到3个数字。

怎么会产生这样机智的想法?其实,如果你学了递归,并且在黑板上好好研究,这一点就会变得显而易见。这样你就能继续去解决这个问题,实际上就这一点就有多种实现方法,下面这个便是面试中最常见的:

就是这样,结合这个函数计算出neighbors 就可以了。这时候,你就可以捏捏肩膀休息下了,因为到这里,你已经刷掉很多人了。第3阶:记忆

那么,我们能做的更好么?使用上面的方法,并不能。我喜欢这个问题,也是因为他能一层一层带出大家的智慧,找到更高效的方法。为了找到更好的方法,让我们看下这个函数是怎么调用的,以count_sequences(6, 4)为例。注意这里用C作为函数名简化。

你可能注意到了,C(6, 2)运行了3次,每次都是同样的运算并返回同样的值。这里最关键的点在于这些重复的运算,每次你使用过他们的值之后,就没有必要再次计算。怎么解决这个问题?记忆。我们那些相同的函数调用和结果,而不是让他们重复。这样,在后面我们就可以直接给出之前的结果。实现方法如下:

第4阶:动态设计

如果你再看看前面的递归关系,就会发现递归记忆的方案也有一点局限性:

如果你把整个的函数调用图想象成某种虚拟的树,你就会发现我们在执行深度优先策略。这并没有什么问题,但是它没有利用到浅依赖这个属性。如何实现广度优先策略?这里就是一种实现方法:

评估

到这里,基本就算完了。设计并实现一个线性时的、产量内存的方案,在面试中是非常好的结果。在我的面试中,如果有面试者写出动态编程设计,我通常会给他一个极高的评价:excellent!

当评估算法和数据结构的时候,我经常会说:面试者对问题认识清晰,并且考虑到各方面的可能,当指出不足时他也能迅速改进并提高;最终,实现了一个不错的解决方案。当评估代码的时候,我最理想的说法是:面试者迅速并精确地把想法转化为了代码;代码结构严谨,容易阅读。所有特殊情况都有概括,并且认真检查测试了代码,确保了没有Bug。总结

我知道,这个面试问题看上去似乎有点吓人,尤其整个解释下来非常繁琐。但本文的目的和面试中完全不一样。最后,一点面试相关的技巧,以及一些好的习惯,分享给大家:

  • 一定要手动来,从最小的问题开始解决。

  • 当你的程序在做无用的运算时,一定要注意去优化。减少不必要的运算能够让你的解决方案更加简洁,说不定能因此发现更高效的方案。

  • 了解你的递归函数。在实际生产中,递归常常很容易出问题,但它仍旧是非常强大的算法设计和策略。递归方案也总是有优化和提高的余地。

  • 要常常去寻找记忆的机会。如果你的函数是目的性的,并且会多次调用相同的值,那么就试着去存储起来。

喜欢就点「在看」吧

Google的面试题长啥样?看完被吊打!相关推荐

  1. Google的面试题长啥样

    转载自  Google的面试题长啥样 本文翻译自Google工程师/面试官Alex Golec的文章:Google Interview Questions Deconstructed: The Kni ...

  2. 自动化测试面试题及答案,看完后吊打面试官!

    自动化测试是什么?自动化测试学什么?自动化测试面试题及答案?–看完后吊打面试官! 一.前言 最近有童鞋和我抱怨,说网上很难搜到那些全面又合适的自动化测试面试题,这里根据我个人的经验以及收集整理的: 你 ...

  3. 猿学~Google I/O 最全记录,看完我们睡不着了!

    钢筋与 LED 交织的露天舞台,双肩包和文化衫组合的黑压压人群,热火朝天的集市与展位,还有隔海相望的 100 万中国观众,你以为这是一场狂欢的音乐节,其实它叫 Google I/O. 欢迎来到离未来最 ...

  4. 8090的你该知道的......很长,但看完后,你会成长

    1.[酒后乱性] 本小姐从来就不相信"酒后乱性"这事儿,每次喝多了回家连卸妆都觉得特费劲,洗漱完了静静躺床上都想吐,更别说来个男的剧烈捅我几下,我肯定想杀了他.你别说你微熏,微熏你 ...

  5. 100个变态的软件测试面试题及答案!——看完变态面试官对你竖起大拇指!

    [纯干货!!!]花费了整整3天,整理出来的全网最实用软件测试面试大全,一共30道题目+答案的纯干货,希望大家多多支持,建议 点赞!!收藏!!长文警告,全文共12000+字,涵盖软件测试面试可能遇到的所 ...

  6. 阿里技术官最新总结一份105道Java面试题小册,看完我惊呆了

    话不多说,直接上题: 一.Java基础 1.什么是面向对象? 2.JDK JRE JVM 3.==和equals比较 4.hashCode与equals 5.final 6.String.String ...

  7. 2021年最全的自动化测试面试题及答案--看完后吊打面试官!自动化测试是什么?自动化测试学什么?

    一.前言 最近有童鞋和我抱怨,说网上很难搜到那些全面又合适的自动化测试面试题,这里根据我个人的经验以及收集整理的: 你没看错,不慌,慢慢来. 先从什么是自动化测试开始说起哈! 二.什么是自动化测试? ...

  8. 2020年最全的自动化测试面试题及答案--看完后吊打面试官!自动化测试是什么?自动化测试学什么?

    一.前言 最近有童鞋和我抱怨,说网上很难搜到那些全面又合适的自动化测试面试题,这里根据我个人的经验以及收集整理的: 你没看错,不慌,慢慢来. 先从什么是自动化测试开始说起哈! 二.什么是自动化测试? ...

  9. 结构体内元素不确定_氮长叶,磷长果,那么生物菌肥能长啥?看完终于不纠结了...

    农民朋友们都知道,"庄稼一枝花,全靠肥当家",肥料对于作物产量的高低起着决定性因素. 蔬菜的产量.品质.病虫害.早衰.死亡.落花.落果.干尖干叶等都与肥料有着密切的关系. 如今市面 ...

最新文章

  1. DeepMind新论文:给侧面照片,AI给你脑补出正面
  2. Ubuntu显示隐藏文件和文件夹
  3. 第18条:接口优于抽象类
  4. Dubbo-go 源码笔记(一)Server 端开启服务过程
  5. C#使用NPOI导出Excel文件
  6. Spring AOP 五大通知类型
  7. JS中URL编码方法的比较
  8. 阅读《软件工程—理论方法与实践》第四章心得体会
  9. 关于机器学习的十个实例
  10. OpenCV——距离变换与分水岭算法的(图像分割)
  11. ORA-00091错误的解决方式
  12. API拦截的应用,网址劫持
  13. 电脑坏掉之后,Oracle数据恢复
  14. 解决:idea打开项目后卡住,界面一直白色
  15. 在分析仪中创建用户自定义的TRL校准件【以RS矢量网络分析仪为例】
  16. FOP生成PDF中文乱码问题解决
  17. Ipad IOS 蓝牙键盘快捷键
  18. java费切罗_细数目前主流的十二个自行车种类
  19. 乐优商城第六篇:域名访问与品牌查询
  20. DurIAN模型介绍

热门文章

  1. 【PAT (Basic Level) 】1028 人口普查 (20 分)
  2. 【Codeforces】1093C Mishka and the Last Exam
  3. 自动驾驶中实时车道检测和警报
  4. 百度绝对控股,小度科技独立融资,投后估值200亿元
  5. 谷歌排名第一的编程语言,死磕它这两点,小白也能学的会!不信你看!
  6. 4大主流CPU处理器技术架构,不知道就out了!
  7. 算力觉醒后,智慧距离勃发就只差一个想法
  8. 20T数据、百万奖金,同济和武大摘得开放数据创新应用大赛桂冠!
  9. 知识图谱升温之势已现,不要错失下一个AI风口
  10. 如此精心整理的深度学习资源只在这里,值得你拥有!(上篇)