昨夜阿里实习生笔试:印象深刻的几道题

缘由

昨晚去阿里巴巴的北邮考场参加笔试:今年的实习生。有几道题让我印象深刻。暂时记录于此。沿路和一个在北邮读过硕的同学聊了聊,说北邮很有计算机氛围,而且自习室经常爆满,为了抢座还有打架的。虽然别人打架的原因不调查不能妄下结论,不过北邮学计算机的氛围真是让我好生羡慕。

过桥题

题干

甲、乙、丙、丁四个人过桥,分别需要1分钟,2分钟,5分钟,10分钟。因为天黑,必须借助于手电筒过桥,可是他们总共只有一个手电筒,并且桥的载重能力有限,最多只能承受两个人的重量,也就是说,每次最多过两个人。现在希望可以用最短的时间过桥,怎样才能做到最短呢?你来帮他们安排一下吧。最短时间是多少分钟呢?

解答

这个题,本来在老师的算法课上讲过。不过笔试的时候略微有点忘了具体方案,却记得该题答案。本来还很气愤,不错最后又做出来了。我就不写具体方案了。
关键就是要明白一件事,10和5是必须要一起过去,因为他们两个是过桥最长时间和过桥次长时间。所以必须用充分利用过桥最长时间的时间,不浪费掉,所以他们两个要一起走过桥。具体方案我就不给了。另外答案是17分钟。

亏钱的题

题干

一天有个年轻人来到王老板的店里买了一件礼物这件礼物成本是18元,标价是21元。 结果是这个年轻人掏出100元要买这件礼物。 王老板当时没有零钱,用那100元向街坊换了100元的零钱,找给年轻人79元。 但是街坊后来发现那100元是假钞,王老板无奈还了街坊100元。 王老板在这次交易中到底损失了多少钱???

解答

我最终还是被绕进去了,选了错误的答案,算了礼物的成本和老板补给年轻人的钱,还有就是老板退给街坊的钱。却忘了街坊还(hai 二声)给了老板100元钱。
其实最聪明的人一眼就看穿了,老板与街坊换不换钱对本题是完全没有影响的,与街坊换钱完完全全就是干扰。


指出二分查找的源码的bug

题干

这题是编程之美上的类似题,我已经记不得考试场上的源码了,所以我只能拿编程之美上的源码来说说这个题,编程之美上给的源码是:
int bisearch(char** arr, int b, int e, char* v)
{
 int minIndex = b, maxIndex = e, midIndex;
 while(minIndex < maxIndex)
 {
 midIndex = (minIndex + maxIndex) / 2;
 if(strcmp(arr[midIndex], v) <= 0)
 {
 minIndex = midIndex;
 }
 else
 {
 maxIndex = midIndex – 1;
 }
 }
 if(!strcmp(arr[maxIndex], v))
 {
 return maxIndex;
 }
 else
 {
 return -1;
 }
}

解答

现在回想起来,
有一个难一点的bug我是找到了,就是当数组长度为奇数的时候,有可能会无限循环,如:minIndex 为1,maxIndex为2,当然(1+2)/2时,midIndex还是为1,那么如果满足strcmp(arr[midIndex], v) <= 0,则minIndex=midIndex=1,那么就无限循环了。
但是有一个更为基础的bug,当时我在编程之美的书上看了之后印象深刻,到了考场缺想不起来来了,那就是midIndex = (minIndex + maxIndex) / 2;中的minIndex + maxIndex可能会出现上溢出,那么midIndex 会成为负数,所以,我们应该写成midIndex = minIndex+(maxIndex - minIndex) / 2;

指针的大小

暂时不去探究其原因的话,请记住:
  1. 32位机器的指针大小是 4字节。
  2. 64位机器的指针大小是 8字节。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值