先看第一题:
1) 有三个连续的,大于六的整数,已知其中两个是质数,求证第三个数能被6整除。
那这道题的正确解法是什么呢?
你要先把被6整除这个问题,分解成同时能被2整除,也能被3整除,然后你只需要证明第三个数既能被2整除、也能被3整除就可以了。题干告诉我们,题中的三个数,有两个数都是质数,这三个数里能被2整除的数和能被3整除的数,只能是同一个数,也就是这两个质数之外的第三个数。这样,我们就证明了第三个数既能被2整除也能被3整除,也就是能被6整除。
这道题能考验一个人"分解问题"的能力,对应到这题,就是把能被6整除这件事情拆解为能被2整除,也能被3整除这两个小问题。这种能力特别重要。
第二题:
2) 有2个骰子,每一个骰子都是6面的正方体,每一面上只能放0到9的数字一个,问这2个骰子如何组合,可以达到显示日历的效果(从01-31)?
我们有两个立方体,那就一共12个面。现在有0-9,一共10个数,放到这12个面上,所以,一定有数字是重复出现在两个立方体上的。那么,哪些数是会重复出现的呢?日历有11号和22号,所以1和2这两个数字在两个立方体上必须都出现。那这样一算,正好就是12个数字和12个面,可以一一对应了。当日期是一位数的时候,还需要在十位的位置上补位呢,所以0也必须同时出现在两个立方体上。那就是6和9。到这为止,这个问题就解决了。
那这个问题考核的是什么呢?这里的考点叫"跨越思维",也就是跳出固定框架去思考的能力。如果你觉得6就是6,9就是9,那就是没有跳出固定的思维框架。
第三题:
3) 昨天,我早上8点爬山,晚上8点到山顶。睡了一觉后,今天,我早上8点从山顶原路下山,晚上8点到山脚。请问,有没有一个时刻,昨天和今天,我站在同样位置?
这道题我先告诉你答案:一定有。
你可以把这道题转换成这样的一道题:你和另一个人,一个从山顶往下走,一个从山脚往上走,走的是同一条路,是不是一定会相遇?答案是一定的啊,你们走在一条路上,一定会遇见的。
这道题就是这么简单,但如果你不懂得"转换思维",可能就是答不出来。
这个"转换思维"有什么用处呢?就是用"其实就是"这四个字,看透问题,然后找到解决方案。
第四题:
4) 上海有多少辆自行车?
这道题考的是"系统思维"。也就是你理解一个系统、事物之间的关联的能力。这道题其实是没有标准答案的,我在这给你提供几种思路。
比如,你可以先查一下上海一共有多少人口,接下来你可以估算一下,这些人口当中有多大比例是骑自行车的?比如可能20-60岁之间,工作的人会骑自行车,通过比例你可以估算出有多少自行车。你还可以大致算一下上海有多少条街道,每条街道大致能容纳多少辆自行车,这样也能得出一个相对准确的数字。甚至在以前,自行车挂车牌的时候,有的人会说,我去街上随机拦几十辆自行车,算出这几十辆自行车车牌数字的中位数,通过这个中位数,我也能算出上海市一共发放了多少车牌。
目的测试你的思路,测试你发现自行车和群、自行车和街道、自行车和车牌或者和这个生态中其他因素的关系的能力,也就是建立模型,构建系统的能力。当你建立模型,构建系统的能力越接近现实世界,你的"系统思维"能力就越强。
最后一个题,第五题:
5) 如何用两个指针,来判断一个链表是否有环?
上周说这道题的时候,我说大部分人是没学过数据结构的,如果你不懂,可以忽略这道题。这其实是我埋的一个伏笔。我之所以放这道题在这,就是想看看,在不懂计算机、不懂数据结构的情况下,你是否会去查一查什么是链表,什么叫做指针。
这道题考察的就是你的求知欲和快速学习的能力。
什么叫做用两个指针来判断一个链表是否有环?
你可以把"链表"想象成无数的小房间,每个房间里面都有一张纸条,纸条里上写的是下一个房间的坐标,如果你进到第357号房间,纸条上写着456,那你就跑到第456号房间。然后456房间里面写着578,你就再跑到578号房间,然后从578再到632,从632再到7号房。这就叫链表。
那什么叫有环呢?你到了7号房间,发现里面的纸条写着456。你进到456,咦,我刚才不是来过吗?这就是环。那什么是指针呢?你,或者说一直在走的这个人,就是指针。
那怎么来判断这个链表是不是有环?这里面考察的就是"相对思维"。
这道题的解法是这样的。让两个人同时走房间,其中一个人一间一间的走,另一个人要走得更快一些,在前一个人走一个房间的时间内,他要走两个房间。这样,每当前者走一个房间,后者就比前者多走了一个房间,相对于前者,后者多走的房间就会越来越多。那么,如果这个链表有环的话,后者就一定会在某一个房间和前者相遇。否则,两人都会先后到达终点。
这就是"相对思维",就是让你在一个无休无止的问题里面,懂得制造相对速度。
好了,通过这5道题看到微软面试人时,非常看重的,独立于专业知识的几种思维能力:分解能力,跨越思维,转换思维,系统思维,和相对思维。