新智元|谷歌面试官亲授,抓住「金九银十」的尾巴!技术面试如何准备( 二 )
文章图片
Level2:递归生成数字
不管怎样 , 我们来看看解决方案 。 也许你已经注意到这个问题可以通过列举所有可能的数字并计算它们来解决 , 可以使用递归来生成这些值:
文章图片
这是一种非常普遍的想法 。 然而 , 生成的数字并没有真正的使用它们 。 这个问题要求的是数字计数 , 而不是数字本身 。
一旦计算了一个数字 , 就再也不会重访它了 。 作为一般的经验法则 , 作者建议注意当解决方案计算一些不使用的东西时 , 在通常情况下可以把它删除 , 然后得到一个更好的解决方案 。
钻石方案:高级一些的想法
Level3:「不计数的计数」
怎样才能在不产生电话号码的情况下计算电话号码呢?请注意 , 从n跳中给定的起始位置生成的数字计数等于从n跳中的每个相邻位置生成的数字计数之和 。
从数学角度来说 , 它是一个递推关系式 , 看起来像这样:
文章图片
有很多实现使用了这个公式的思想 , 但是让我们从我在面试中最常见的一个开始:「朴素的递归方法」:
文章图片
接下来这个问题会经常从面试中听到:「这个解决方案的复杂度是多少」 。 对于那些不知道的人来说 , O(N)复杂度是一种速率 , 一个解决方案所需的计算量随着函数输入大小的变化而增长 。 对于这个问题 , 输入的大小是跳数 。
对于这种实现 , 每次递归调用count_sequences()至少两次 , 因为每个键至少有两个邻居 。 由于我们递归的次数等于所需的跳数 , 并且每次调用时计算_sequences()的调用数量至少翻了一番 , 因此运行时的复杂度至少为指数级 。
接下来通常的做法就是解决时间复杂度太高的问题 。
Level4:降低复杂度
为了找到下一个函数 , 让我们把这个函数调用的函数映射出来 。 让我们考虑count_sequences(6,4)的情况 。 注意:为了简洁起见 , 使用c作为函数名:
文章图片
注意这里c(6,2)调用执行了三次 , 每次执行相同的计算并返回相同的值 。 这里关键的一点是 , 这些函数调用会重复调用 , 每次都返回相同的值 。 一旦你计算了他们的结果 , 就不需要重新计算了 。
【新智元|谷歌面试官亲授,抓住「金九银十」的尾巴!技术面试如何准备】使用制表法可以解决这个问题 , 这基本上意味着我们可以记录之前看到的函数调用的结果 , 并使用这些结果来代替重复工作 。
这样 , 当我们在调用图中遇到不必要地重新计算整个子树的位置时 , 可以立即返回已经计算的结果 。 下面是一个实现:
文章图片
经过这样的处理 , 复杂度就已经降到了线性的结果 。
这个解决方案依旧有一些不足之处 , 主要的缺点是它是递归的 。 大多数语言都对其调用堆栈的最大大小进行限制 , 这意味着总是需要考虑可以支持最大的跳数 。
Level5:动态规划
请注意 , n跳的结果仅依赖于n-1跳调用的结果 。 同时 , 缓存包含每个(非零)跳数的条目 。
学过归纳法的人都知道 , 可以使用递推关系式归纳步骤 , 可以从零跳数的基本情况开始 , 并归纳推导出所有大于零的值 。 下面是它的一个实现:
- “女面试官:我背后拉链开了,你要如何提醒我?”:当场被录取!
- 程序员面试攻略:技术面到HR面,通关小技巧
- 《令人心动的offer》中有哪些面试小技巧?
- 曦说职场|顺利获得工作很简单,面试奇葩问题到底考求职者什么?摸清HR目的
- 见小曰明|找个工作要用这种下三滥手段吗?,“跟面试官说竞争者是女朋友”
- 两面真相|面试话题:什么样的面试官最可贵?什么样的求职者最难得?
- 老王职场录|却从没有真正的来过?小伙机智回答,面试官:什么东西经常会来
- 格式化孤单|2021银行面试|速来查看银行面试自我介绍范文篇集锦
- 苑燕儿|情商高又加分,面试官:3个月没上班你都在干啥?聪明人这么回答
- 微微米米儿|拿什么击败对手?,公务员面试