微软笔试面试题集锦


(一)编程实现两个正整数的除法

编程实现两个正整数的除法,当然不能用除法操作符 

想法是这样的:被除数不断减去含除数的最大2^n倍数。例如,200/5,那么以此为200-5*2^5=40 result = 2^5 =32 ,40-5*2^3=0 result=32+2^3 = 40。所以结果为40.



int div(const int x, const int y) {
int left_num = x;
int result = 0;
while (left_num >= y) {
    int multi = 1;
    while (y * multi <= (left_num >> 1)) {
       multi = multi << 1;
    }
    result += multi;
    left_num -= y * multi;
}
return result;
}

 问题扩展:

如果需要测试上面这个函数,需要哪些测试用例?
1)正负数的组合

2)除数与被除数大小组合

 

(二) 一块长方形的蛋糕,其中有一个小长方形的空洞(角度任意)。使用一把直刀,如何一刀将蛋糕切成相等的两份?
  
回答:通过长方形中心的的任意直线都能将长方形等分,所以连接两个长方形的中心点的直线可以等分这个蛋糕。

 

(三)写程序找出二叉树的深度  

一个树的深度等于max(左子树深度,右子树深度)+1。可以使用递归实现。

struct Node {
Node* left;
Node* right;
};

int GetDepth(Node* root) {
if (NULL == root) {
    return 0;
}
int left_depth = GetDepth(root->left);
int right_depth = GetDepth(root->right);
return left_depth > right_depth ? left_depth + 1 : right_depth + 1;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值