今天碰到一道比较有趣的面试题,大家来探讨一下。

甲乙两地相距100公里,有一辆火车以每小时15公里的速度离开甲地直奔乙地,另一辆火车以每小时20公里的速度从乙地开往甲地。如果有一只鸟,以30公里每小时的速度和两辆火车同时启动,从甲地出发,碰到另一辆车后返回,依次在两辆火车来回飞行,直到两辆火车相遇,请问,这只小鸟往返了多少次

这个问题比较有趣,有趣的是不是问小鸟飞行了多少距离,而是问小鸟飞行了多少次。如果是问小鸟飞行的距离,则很简单,利用时间相等即可求解,至于求往返的次数的话,似乎只能用递归来调用,我想到的递归算法如下

解答的比较仓促,有兴趣的请一起讨论下。


此部分from: http://www.cnblogs.com/beginor/archive/2009/04/27/1444844.html


----------------------------------------华丽的分割线----------------------------------------


这道"有趣"的面试题是:甲乙两地相距100公里,有一辆火车以每小时15公里的速度离开甲地直奔乙地,另一辆火车以每小时20公里的速度从乙地开往甲地。如果有一只鸟,以30公里每小时的速度和两辆火车同时启动,从甲地出发,碰到另一辆车后返回,依次在两辆火车来回飞行,直到两辆火车相遇,请问,这只小鸟往返了多少次

首先说这个题,我觉得出的并无任何不严谨的地方,也没有能明显让人误解的地方。按照通常的表述,显然题意是忽略鸟的转身时间,忽略鸟的身长,把鸟和火车头抽象成三个点。如果非要考虑鸟的转身时间和身长,我觉得有故意曲解的嫌疑。任何一个应用问题都有隐含的忽略条件,答题者如果要求应用题表述无限精确滴水不漏,是不可能的。所以我觉得有些关于量子物理的言论就没有必要了。如果硬要钻牛角尖,还可以说火车道不是严格的直线,可以说鸟并非匀速直线运动,可以说根据相对论速度和距离、时间应该遵守洛伦兹变换而非伽利略变换。

然后是解法,按照原意,鸟往返了无限多次,可以用数学归纳法证明:

假设第k次两车相距m 小鸟在甲车处
飞到乙车时 两车相距
m-m/(20+30)*(15+20)=0.3m
再飞到甲车
0.3m-0.3m/(15+30)*(15+20)=1/15m

第k+1次往返两车距离为m/15

显然若m>0 第k+1次之后两车距离仍不为0

开始是两车相距100公里不为0  所以不论往返多少次 两车距离都不为0 

本来解到这里,这个题目应该已经可以得出答案了。

但是很多朋友为了编程可实现,规定了一个距离精度,小于这个距离就认为两车相距,然后又递归或者迭代写了代码实现。但是程序员不是编码工,不是所有能实现的代码就是好的。不能只知道模拟,不考虑效率。

根据前面的证明 其实最后往返次数只是一个对数运算(注意求的是往返次数,而不是转身次数)


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace bird
{
    
class Program
    {
        
static void Main(string[] args)
        {
            
double exactDistance = 0.000000001;
            Console.WriteLine(Convert.ToInt32(Math.Ceiling(System.Math.Log(exactDistance 
/ 10001.0 / 15))));
        }
    }
}

 

最后关于时间无限细分的问题 其实类似很多年前就被提出并解决了:http://en.wikipedia.org/wiki/Zeno's_paradoxes

而且类似的计时制中,次数并不是一个悖论,距离才是。

所以这个问题作为面试题,是非常不错的题目,可以从不同的角度回答者的能力:

1.数学和逻辑思维基础:考察面试者是否了解类似的问题并且知道背景知识,能否独立想出解决方案

2.算法优化意识:考察面试者是否仅仅关注最表面的解决方法。二话不说直接写递归交差的程序员肯定不要

3.理解问题能力:考察面试者是否能正确理解问题,理解有偏差时,是否能主动沟通,弄清别人的真正意图。自己假设一堆条件的程序员肯定不要

4.编程语言基础:考察面试者是否能正确运用一门计算机语言。用==直接比较浮点数的程序员肯定不要


此部分from: http://www.cnblogs.com/winter-cn/archive/2009/04/30/1446636.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值