Problem 1. 一个完全二叉树有386个叶子节点,问它总共有多少个叶子节点。
分析:
386个叶子节点,那么它的上层可以确定的非叶子节点有多少个呢?
可以用试探法得到,它上面应该有7层,即非叶子节点数应该有2^8 - 1
= 255个。
根据总的叶子节点数,可以知道第8层一定有叶子节点,可以设第
8层非叶子节点数为x, 叶子节点数为y. 则得到一个方程 x + y = 256
第8层非叶子节点数为x,则第9层叶子节点数为2*x 或者2*x - 1个。由
于知道总的叶子节点数,所以可以得到方程2*x + y = 386 或者
2*x -1 +y = 386.
连解这些方程对:
1. x + y = 256 2. x+y = 256
2*x + y = 386 2*x -1 +y = 386
解得:
1. x = 130 x = 131
y = 126 y = 125
从而我们可以知道总的节点数为255+386+130 = 771或者
255+386+131 = 772个。
Problem 2. 情形1:一个数组,其中只有一个数只出现一次,其余数皆
出现偶数次。设计Time: O(n) Space: O(1)的算法得出那个只出现一次的数。
情形2:如果只有两个数只出现一次呢?
分析: 1. 只出现一次的话好办,将所有的数异或,得到的最后结果就是
我们所要求的那个数。
2. 两个的情形复杂一点,先将所有的数异或得到一个数,然后得
到这个数的二进制表示,找到第一个为1的位,然后判断这个数组中所有的
数,判断这个位是否为1, 是1的划到一个数组中去,如果是0的话,划分
到另外一个数组中去。现在我们的这两个数组肯定都只含一个数只出现一次
其他数全部出现两次。分别对两个数组做异或操作,得到的这两个数即是我们
要求的的两个数。
Problem 3 : 什么是你的不可替代性和核心竞争力?
从Ponba博客上看到的文章,这个问题确实值得我们去思考,只有想清楚了,我们才知
道如何采取行动。详细可以参看Ponba的文章:
http://mindhacks.cn/2009/01/14/make-yourself-irreplacable/
摘录一些Ponba认为可以成为核心竞争力的方面:
可替代性就越高。这个自是不用多说的。
表达沟通能力,Open Mind 等等。
领域,所以独立出来。如何培养学习能力,到目前为止我所知道的最有效的办法就是持续
学习和思考新知识。
包括:专注、持之以恒、自省(意识到自己的问题所在的能力,这是改进自身的大前提)、
好奇心、自信、谦卑(自信和谦卑是不悖的,前者是相信别人能够做到的自己也能够做到,
后者是不要总认为自己确信正确的就一定是正确的,Keep an open mind)等。
Problem4: 一道智力题,给你两个玻璃球,在一个有一百层的楼上往下摔,如果在n层不
会摔碎,那么在n层以下也不会碎,要你怎么以最少的次数判断玻璃球刚好在哪一层会摔
碎。
分析:这道题目其实不是很难,但在面试时候紧张的情况下,还是难免会慌张而答不对的。
我第一次做想到的是两个杯子同时摔,一个在五十层摔,一个在第一层摔,那么总共最多
需要五十次。后来面试官说我的杯子利用率太低了。想了一两分钟后还是没想出来,就放弃
刚一离开,就想到更好的方法了。把我气坏了。是这样子的,一个在1层摔,一个在第十层
摔,如果第十层摔碎了,那么最坏情况下只要在摔8次就可以了,第一个杯子从第二层一直摔
到第8层。如果第十层没碎,可以将这个杯子放到20层,第一个杯子放到第十一层。然后这样
一直操作,最多摔20次就可以得到哪一层刚好会被摔碎了。
Problem 4: 如何从N中选择前K个最大或最小的数,用什么算法最好?
O(N * log2N)还是O(N * K)?这取决于K的大小,这是你需要在面试者那里弄清楚的问题。
在K(K < = log2N)较小的情况下,可以选择部分排序,如简单选择排序就满足要求。