趣味面试题集锦02

 

D-1 在一个火车站:每 10 分钟就有一火车离站向南开去;每 10 分钟,也有另外一辆火车离站向北开去。每天,你到达这个火车站的时间并不是固定的(换言之,在时间上你是随机到达火车站的)。但是在你每次到达以后,你就会乘坐最先到站的火车离开,而不管它是往北或者是往南开。这样在乘坐了一年以后,你发现在 90% 的天数里,你所乘坐的是南行的火车。请问这是为什么?

解析:答案是“南行的火车时间比北行的时间早 1 分钟”。这是一道概率题。我们考虑连续两次向南发车时间点 a b 之间的时间段,在这个时段内肯定会在某个时刻向北发一次车,该时间点我们记为 c 。考虑到每次到火车站后会选择最先到站的火车离开,那么在 a b 间的时间段内,选择向北火车的概率是 (c-a)/(a-b)*100% 。当我们把目光从 a b 间的时间段扩展到整一天时,该结论同样正确。所以,当你发现 90% 的天数中乘坐的是南行的火车时,即有 (c-a)/(10min)*100%=(1-90%) 成立,易得“南行的火车时间比北行的时间早 1 分钟”。

 

D-2 :有两个数组 a,b ,大小都为 n, 数组元素的值任意,无序。要求通过交换 a,b 中的元素,使数组 a 元素的和与数组 b 元素的和之间的差最小。

解析:这是华为的一道面试题,要求在 8 分钟内解决。一种简单可行的方案是遍历查询(也就是穷举法),对于 A B 数组中的数据存放在一个数组 Data 中,假设两个数组各有 NUM 个元素。那么我们在 Data 数组中选择有 NUM 个元素的所有情况(使用组合代数),计算选出子数组的和与未选数据的和之间的差值。记录最小差值的情况,然后显示之。

当然,这种方案显然不是最优解,但是确实有个可行的方案。(其实,我认为即使使用该方案在 8 分钟内实现 C 代码也是不现实的,除非是伪代码)。 Chinaunix 论坛上 帖子 专门讨论它,有兴趣的朋友可以去看看。下面给出我写的实现代码


 

E-2 :将 1,2,3,4,5,6,7,8,9 9 个数分成三组 , 组成 3 个三位数 , 且使这 3 个三位数构成 1:2:3 的比例 , 例如 :3 个三位数 192,384,576 满足以上条件 .192:384:576=1:2:3 。试求出所有满足条件的 3 个三位数。

    解析: 1 9 组成的最小三位数是 123 ,最大的是 987 ,由于要满足 1 2 3 的关系,最小的那个数应该不到于 987/3 329 。这个问题的求解可以对每个数 n(123<=n<=329) 使用枚举法。

对于每种情况,鉴于只是需要判断这三个数是否由 1~9 组成且各个数组不相同,即这三个数的各位数是否覆盖了 1~9 ,那么一种合理的解法是判断各位数字的积是否等于 9 !且各位数字的和是否等于 45

在我自己写的程序中,使用的方法是对三个数的每位上的数做简单加法,平方和以及立方和;继而与 45 285 2025 比较。实现如下:


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值