谷歌那些刁难工程师的难题解答
谷歌面试未来的工程师的题目一向是很难的。但下面这些不同于以往你看到的那些,因为它们还需要你具备一定的计算和逻辑基础。
1.一排房子涂色的问题解答
问题:我们会有一排房子,你可以理解为“N”间,其中N是整数。每个房子可以涂成红色、绿色或蓝色。每幢房子和相邻间的房子必须是不一样的,因为每种颜色的成本不同,所以还要考虑到尽可能降低成本。
答案:这个问题可以建模变成一个“动态编程”问题的解决方法,这会有效地解决大范围的搜索和优化问题。
这里有代码可以供大家参考:C[c] = H[c] + min(C[i-1][x]) x belongs to {Red, Blue, Green} x belongs to c.
2.在一个句子中实现每个单词的反向字符
问题:Convert “——— “my career stack” ———” to “”——— “ym reerac kcats” ———”.
答案:不仅仅是翻转每个字符,还需要采取一个更聪明的方式。
你可以通过翻转每个字符的方式解决这个问题,但有一个更聪明的叫递归的办法来解决它。这才是谷歌想要的结果:找到解决问题最聪明的工程师,而不仅仅是获得一个正确的解决方案。
3.找到购买和出售股票的最好时间
问题:如果你只能购买和出售相同的股票份额,找到一个买入和卖出的最佳时间。
答案:记住你在买股票之前,可以把它卖掉。这一点限制实际上完全改变了问题的结果。所以,现在你要跟踪最低值指数。下面是整体解决方案:
为了有效地解决这个问题,你需要跟踪最低值的指数。你需要寻遍并发现最低值指数达到一个新的最小值。然后,比较最低值与当前元素的差异。在买进和卖出时的差异确定是最大的差异。
4.N个硬币一排怎么选最大
问题:一排硬币由两名球员轮流各取一枚,直到拿完为止,谁拿到的金额大谁就赢了。
答案:你一定要先拿!如果你考虑奇数或者偶数的硬币,那么你至少不会输。这其实是另一种“动态编程”的问题。
5.悬空指针是什么?
问题:很简单对吗?
答案:那是毁灭性的错误。悬空的指针是一个不再分配到存储的指针。但有一个问题,这个程序在创建之后不会崩溃,而回执行很长一段时间。每个工程师都了解这些问题,因为它们最终会杀死一些最大、最复杂的服务。
6.从不公平的硬币上找到一个公平的结果
问题:我们有一个不公平的硬币,因为其正反两面结果的概率不同,如何才能得到公平的结果。
答案:抛两次硬币。有四种可能发生,如果有两个正面或者反面的结果,你应该放弃。然后留下一个正面、一个反面的结果,这才是你想要的结果。
7.在字典中找到一个单词是由两个单词组成的
问题:在字典里找到一个单词是由两个单词组成的,比如“newspaper”是由“news”和“paper”组成的。
答案:将单词分成两个部分。比如你将“newspaper”分成“newsp”和“aper”两个部分。然后你查字典看看有没有这两个单词,如果没有,那么重新对这个单词进行分隔,直到找到答案。
8.一个停车位有三分之一时间是空闲的
问题:一个停车位有时候你会发现连续9天都是停了车的,但第10天却没有停车,你怎么能判断?
答案:这是一个棘手的概率问题,所以就需要答案合乎逻辑。在概率问题上,如果一个事件已经发生,它不会对未来起到任何影响,即使已经停了9天,也不能证明第10天就一定是空闲的,所以你需要计算题目中那个三分之二的概率实际中到底有多大几率。
3