笔试题 1.5 微软 2012 09.28 程设

1,求取二叉数的深度;

   int depth(Node *root){
          if(root == NULL)
               return 0;
          int left_depth = depth( root.left_child);
          int right_depth = depth( root.right_child);
         return (left_depth > right_depth) ? left_depth+1 : right_depth + 1;
  }

2, 利用天平砝码,三次将140克的盐 分成50、90克两份?砝码共两个,一个2克,一个7克,限定只能称3次;

     方法一,将140分割,第一次分为70+70;  第二次将一个70克分为 35 + 35; 第三次将35分割,这里只能将较小的数据进行

分割,因为砝码个数有限,且所能够表达的重量值也是极为有限的;所以另外一种思路就是尝试着去分割50克;这里,将7和2砝码分放

一边,所以可以得到 7 + 15  == 2 + 20,亦即,将32克的盐分为了15 和20两份,这样, 15 + 35 凑出了50克,剩余的则是70克;

   方法二,直接考虑如何用7和2凑出50, 第一次称重,可以得到7+2=9克, 然后 9克 + 9 = 18 克;第三次的称重则为 7和2各摆一边,得到

7+18 = 2 + 23克,得到了23克,所以,23+18 + 9 = 50克;

3,  地球上有多少个满足这样条件的点 , 站在地球上的某一点,向南走一公里,然后向东走一公里,最后向北走一公里,回到了原点。地球上有多少个满足这样条件的点?

    首先很容易想到北极点; 其次,在想想南极那旮旯的,如果距离南极点很近的一个小圈,自圈上一点向南走1公里,然后在这个点所在的纬度圈,其周长恰好是1公里,

那么当我们向东走一公里时,就会回到了圈上的原点,最后向北走一公里,就回到了出发点; 这样的圈圈上的点可是有无数多的;

4, 有三个水果篮。其中一个里面只有苹果,一个里面只有橘子,另外一个既有苹果又有橘子。每个水果篮上都有标签,但标签是错的。如何检查某个水果篮中的一个水果,然后正确标注每个水果篮

    这道题其实很容易,注意到其中一个关键字: "都", 那么检查能够带来最大变数的选项,因为它标错了,所以就只能是某种单一水果;所以如果它拿出的是apple,那么标为apple的一定是混合的,剩下的则是orange;如果是拿出了orange,则标注为orange的一定是混合的,而标为orange的一定是apple;

5, 不利用浮点运算,画一个圆 不利用浮点运算,在屏幕上画一个圆 (x**2 + y**2 = r**2,其中 r 为正整数)

   既然不能开根号去计算y或者x,就只能逐个尝试了,例如,从确定点(0,r ) and (r, 0)开始,逐步搜素,变化步长为整数 1,如, (1, r), (0, r-1), (1, r-1) 

6, 将一个句子按单词反序 将一个句子按单词反序。比如 “hi baidu com mianshiti”,反序后变为 “mianshiti com baidu hi”

   分两步来做,第一步是将整个字符串进行反序操作,然后对于反序的字符串当中的单词在进行反序操作;

7, 计算n bit的整数中有多少bit 为1 

    看到这道题,第一个想法就是使用ptx或者sse指令popc来直接对于32bit/64bit整数进行求解;

    或者,使用位运算 right shift + bitwise-and

8,快速求取一个整数的7倍

    注意,快速就是暗示使用位运算来求解, 7*x = (x<<3) - x;

9,判断一个数是不是2的n次幂 

     这个也比较好做,很基础;  if( x & (x-1) != 0)  return false;

    但是,需要首先检查是否为0, 将这个特殊情况排除掉,一定不要忘却了。。。

10, (三只蚂蚁不相撞的概率是多少)在三角形的三个顶点上各有一只蚂蚁,它们向另一个顶点运动,目标随机(可能为另外两个顶点的任意一个)。问三只蚂蚁不相撞的概率是多少

        想想蚂蚁爬的方向,左右各一,共有2*2*2 = 8种,而不会相撞的情形有两种,顺时针和逆时针;所以概率为2/8 = 1/4

11, 判断数组中是否包含重复数字 给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字。(原数组不必保留)

      长度为N,每个元素范围都是N,那么就容易了,i元素直接标记第i个位置,并累计在那个slot当中,如果slot当中的累积值>1, 那么就表明有了重复数字;

12, 如何将蛋糕切成相等的两份 :一块长方形的蛋糕,其中有一个小长方形的空洞(角度任意)。使用一把直刀,如何一刀将蛋糕切成相等的两份?

通过长方形中心的的任意直线都能将长方形等分,所以连接两个长方形的中心点的直线可以等分这个蛋糕。

13, 一个没有排序的链表,比如list={a,l,x,b,e,f,f,e,a,g,h,b,m},请去掉重复项,并保留原顺序,以上链表去掉重复项后为newlist={a,l,x,b,e,f,g,h,m},请写出一个高效算法(时间比空间更重要)。

      题目当中说时间比空间更为重要,这样设计就简单了,所以可以使用hash-table的方法来解决;

 14, 小明一家过一座桥,过桥时是黑夜,所以必须有灯。现在小明过桥要1秒,小明的弟弟要3秒,小明的爸爸要6秒,小明的妈妈要8秒,小明的爷爷要12秒。每次此桥最多可过两人,而过桥的速度依过桥最慢者而定,而且灯在点燃后30秒就会熄灭。问:小明一家如何过桥?

小明与弟弟过去,小明回来,用4s; 妈妈与爷爷过去,弟弟回来,用15s; 小明与弟弟过去,小明回来,用4s; 小明与爸爸过去,用6s; 总共用29s

题目的关键是让速度差不多的一起走,免得过于拖累较快的一个人。

15, 题目的关键是让速度差不多的一起走,免得过于拖累较快的一个人。

     这个题目其实很简单,可以有不同的做法选择,核心就是如何能找到所需要数目的质数,而求质数的做法,可以有开根号的方法,或者是利用1~n-1作为除数进习

暴力的试除,或者是利用bit-vector将质因子的倍数位置进行标记;     

原文地址:https://www.cnblogs.com/superniaoren/p/3343187.html