【题目29】一些简单的算法练习题(3)

来源:互联网 发布:云平台软件架构 编辑:程序博客网 时间:2024/05/17 20:25

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认为可以成为核心竞争力的方面:

  • 专业领域技能:成为一个专业领域的专家,你的专业技能越强,在这个领域的不
  • 可替代性就越高。这个自是不用多说的。

  • 跨领域的技能:解决问题的能力,创新思维,判断与决策能力,Critical-Thinking,
  • 表达沟通能力,Open Mind 等等。

  • 学习能力:严格来说学习能力也属于跨领域的技能,但由于实在太重要,并且跨任何
  • 领域,所以独立出来。如何培养学习能力,到目前为止我所知道的最有效的办法就是持续

    学习和思考新知识。

  • 性格要素:严格来说这也属于跨领域技能,理由同上。一些我相信很重要的性格要素
  • 包括:专注、持之以恒、自省(意识到自己的问题所在的能力,这是改进自身的大前提)、

    好奇心、自信、谦卑(自信和谦卑是不悖的,前者是相信别人能够做到的自己也能够做到,

    后者是不要总认为自己确信正确的就一定是正确的,Keep an open mind)等。

     

    Problem4: 一道智力题,给你两个玻璃球,在一个有一百层的楼上往下摔,如果在n层不

    会摔碎,那么在n层以下也不会碎,要你怎么以最少的次数判断玻璃球刚好在哪一层会摔

    碎。

     

    分析:这道题目其实不是很难,但在面试时候紧张的情况下,还是难免会慌张而答不对的。

    我第一次做想到的是两个杯子同时摔,一个在五十层摔,一个在第一层摔,那么总共最多

    需要五十次。后来面试官说我的杯子利用率太低了。想了一两分钟后还是没想出来,就放弃

    刚一离开,就想到更好的方法了。把我气坏了。是这样子的,一个在1层摔,一个在第十层

    摔,如果第十层摔碎了,那么最坏情况下只要在摔8次就可以了,第一个杯子从第二层一直摔

    到第8层。如果第十层没碎,可以将这个杯子放到20层,第一个杯子放到第十一层。然后这样

    一直操作,最多摔20次就可以得到哪一层刚好会被摔碎了。

     

    Problem 4: 如何从N中选择前K个最大或最小的数,用什么算法最好?

    ON * log2N)还是ON * K)?这取决于K的大小,这是你需要在面试者那里弄清楚的问题。

    KK < = log2N)较小的情况下,可以选择部分排序,如简单选择排序就满足要求。