火车运煤
这个可能是一个比较经典的智力题了,和以前的那个《赛马问题》很相似,其题目如下:

你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多只能装1000吨煤,且其能耗比较大——每一公里需要耗一吨煤。请问,作为一个懂编程的煤老板的你,你会怎么运送才能运最多的煤到集市?
这道题一开始看上去好像是无解的,因为你的火车每一公里就要消耗一吨煤,而到目的地有1000公里,而火车最多只能装1000吨媒。如果你的火车可以全部装下,到目的地也会被全部烧光,一丁点也不剩。所以,很多人的第一反应都是觉得这个不太可能。
如果你一开始就觉得不太可能的话,这是很正常的。不过我不知道你还会不会继续思考下去,如果你不想思考下去了,那么我很为你担忧,因为你可能并不是一个不善于思考的人,而是一个畏难的人,还有可能是一个容易放弃的人。这对于你做好 一个需要大量思考的工作的程序员来说可能并不适合。
我一开始也觉得不可能,后来想了一想,想到一个解法可以最多运送500吨煤到市场,方法如下:(希望你先自己想一想再查看这个答案)
装1000吨煤,走250公里,扔下500吨煤,回矿山。
装1000吨煤,走到250公里处,拿起250吨煤继续向前到500公里处,扔下500吨煤,回矿山。此时火车上还有250吨,再加上在250公里处还有250吨煤,所以,火车是可以回矿山的。
装上最后1000吨煤,走到500公里处,装上那里的500吨煤,然后一直走到目的。
于是,你最多可以运送500吨煤到市场(当然,火车也回不去了,因为那矿山没有煤了)
赛马问题:

一共有25匹马,有一个赛场,赛场有5个赛道,就是说最多同时可以有5匹马一起比赛。假设每匹马都跑的很稳定,不用任何其他工具,只通过马与马之间的比赛,试问,最少得比多少场才能知道跑得最快的5匹马?(不能使用撞大运的算法)
很明显这是一个算法题,网上有很多贴子在讨论这个问题,不过都没有给出一个明确的答案。我想了想,想到下面的一个算法:
1)分成5组A,B,C,D,E,比五场。然后根据每场结果分别给这五组内的五匹马排序(从快到慢)。
2)每组的头名再赛一场,取走第一名,然后该组第二名顶上。
3)重复第二步,直到选出前5名。
这个算法是比较笨的算法,总计需要赛10次,这个算法应该是万无一失的。现在的问题的就,如何优化这个算法,想了想,的确是有优化的空间的。也就是说,是可以少于10次的。
想了一想,上面的那个算法自从第6次开始就使用5个排序数组的头名做“冒泡法”,总是挑一个最优秀的出来,其实,在第6次以后除了挑出最优秀的,我们还可以在每次比赛后淘汰一些速度不行的,淘汰的马匹数自然会比选出的更多,所以,一方面在找,另一方面在淘汰,找出前5名的速度应该会更快。
比如:我们假设比赛完第六场后,我们得到下面的排序:(每组排序是——快马从左到右,各组头名的排序是——快马从上到下)
A组 A1 A2 A3 A4 A5
B组 B1 B2 B3 B4 B5
C组 C1 C2 C3 C4 C5
D组 D1 D2 D3 D4 D5
E组 E1 E2 E3 E4 E5
这样,我们不但知道,A1是25匹马里最快的马,而且我们可以淘汰近一半的马,比如E2,E3,E4,E5就可以全部淘汰了,为什么呢,因为比E2快的马有A1,B1,C1,D1,E1这五匹马,所以,E2后面的马是无法进入前五名了;同理,D3和其后面的也进入不了前5;同理,C4,C5,B5都可以淘汰。
于是,在第六轮后我们可以得知,除了A1外的Top 4必然在下面这些马中:
A组  A2 A3 A4 A5
B组 B1 B2 B3 B4
C组 C1 C2 C3
D组 D1 D2
E组 E1
接下来的过程应该不必我多说了。重复前面的方法,尽可能淘汰无法进前N名的马,于是后面的马就越来越少,你所需要的比赛也会越来越少。
那么,对于这个题,聪明的你知道最少要比赛几场了吗?
举一反三,如果有64匹马,8个赛道呢?不失一般性,如果有N匹马,M个赛道呢?N = M*M,那么公式是什么呢?
 
火柴棍面试题:
有时候,有些面试题是很是无厘头,这不,又有一个,还记得小时候玩的的“火柴棍游戏”吗,就是移动一根火柴棍改变一个图或字的游戏。程序面试居然也可以这么玩,看看下面这个火柴棍式的程序面试题吧。
下面是一个C程序,其想要输出20个减号,不过,粗心的程序员把代码写错了,你需要把下面的代码修改正确,不过,你只能增加或是修改其中的一个字符,请你给出三种答案。
1
2
3
4
5int n = 20;
 
for(int i = 0; i < n; i--){
    printf("-");
}

不要以为这题不是很难,我相信你并不那么容易能找到3种方法。我觉得,如果你能在10分钟内找出这三种方法,说明你真的很聪明,而且反应很快。当然,15分钟内也不赖。不过,你要是30分钟内找不到三种方法,当然,不说明你笨了,最多就是你的反应还不够快。嘿嘿。就当是玩玩吧。
下面是我的答案:
1
2
3
4
5
6
7
8//第一种解法:在for循环中给n加一个负号
for(int i = 0; i < -n; i--)
 
//第二种解法:把 n 初始化成 -20
int n = -20;
 
//第三种解法:把for循环中的 i 初始化成40
for(int i = 40; i < n; i--)

不过,我要告诉你,以上这些答案都不对(我就知道你会偷看答案的),不过,顺着这些思路走很接近了。呵呵。
下面是正确答案——
 
 
1
2
3
4
5
6
7
8//第一种解法:在for循环中给 i 加一个负号
for(int i = 0; -i < n; i--)
 
//第二种解法:在for循环中把 i-- 变成 n--
for(int i = 0; i < n; n--)
 
//第三种解法:把for循环中的 < 变成 +
for(int i = 0; i + n; i--)

其它相关的变种题如下:
通过修改、增加一个字符,让其输出21个减号
通过修改、增加一个字符,让其只输出1个减号
通过修改、增加一个字符,让其不输出减号
(全文完)
 
附一个有趣面试题
大家还记得前些天的那个火柴棍式的面试题吗?很有趣吧。下面是我今天在StackExchange上看到的一个有趣的面试题。大家不妨一起来思考一下。问题如下——
有两个相同功能代码如下,请在在A,B,C是什么的情况下,请给出三个原因case 1比case 2快,还有三个原因case 2会比case 1要执行的快。(不考虑编译器优化)
case 11
2
3
4
5for (i=0; i<N; ++i){
    A;
    B;
    C;
}

case 21
2
3
4
5
6
7
8
9for (i=0; i<N; ++i){
    A;
}
for (i=0; i<N; ++i){
    B;
}
for (i=0; i<N; ++i){
    C;
}

我的第一个反应是——
 
case1 要快一些,因为只有一个i++的i<N的操作,而case 2却有三个,这在点上,case 1就比case 2要快。
case2如果要快的话,有一个原因是,A, B, C其中一个需要去先获得一个资源(比如一个锁),在case1下,每次都要去拿这个资源,而case2下,只需要拿一次然后。但这个可能是不对的,因为我无法想出一个相同的语句块放在case 1中会和放在case 2中有差别。(不过可能比较接近了)
继续思考:这个题有点像是“同步和异步”的问题,case 1是同步,case 2是异步,所以,异步快于同步,也许可以从这个方向出发,写出A, B, C的语句块。
不过,其要三个原因啊。各位,你们有想法吗?

来源:草根网(www.20ju.com) - 互联网界的读者文摘

几个程序员面试题:火车运煤问题、赛马问题相关推荐

  1. 《火车运煤问题》分析

    作者:陈太汉 <火车运煤问题>分析 题目内容: 你是山西的一个煤老板,你在矿区开采了有3000吨煤需要运送到市场上去卖,从你的矿区到市场有1000公里,你手里有一列烧煤的火车,这个火车最多 ...

  2. 由火车运煤问题想到的

    Technorati 标签: 面试题, 火车运煤 本文版权所有,转载请注明出处和作者联系方式. 作者:孙华明 联系方式: wormsun at gmail.com 今天在酷壳网站上看到一道面试题--火 ...

  3. 计算机水平考试 初级,计算机水平考试-初级程序员下午试题模拟38

    计算机水平考试-初级程序员下午试题模拟38 (8页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 初级程序员下午试题模拟38试题一阅读以下说明 ...

  4. Java程序员面试题集(131-135)

    Java程序员面试题集(131-135) 摘要:这部分内容准备重新发布为Java程序员面试题集(151-180),但这篇帖子仍然保留在这里.查看新内容请点击Java程序员面试题集(151-180) 1 ...

  5. php程序员试题,php面试题带答案,php程序员笔试题与答案(一)

    php面试题带答案,php程序员笔试题与答案(一) php程序员招聘笔试题: 问题 1. 选择合适的答案填入空白处 PHP 是一种______脚本语言,基于______引擎.PHP 最常被用来开发动态 ...

  6. java 用程序代码解释继承_关于初级java程序员笔试题

    关于初级java程序员笔试题 Sun 认证Java程序员考试内容涉及Java所有相关知识.编程概念及applet开发技巧.下面是小编整理的关于初级java程序员笔试题,欢迎大家参考! 第一题:判断题 ...

  7. 2008年上半年程序员考试试题分析

    文章试读 不拘一个遍程序系列:编程序不能一个脑袋钻到底,有时要学会变通,即所谓的曲线救国.一.二.三.四 职场规划:一些杂七杂八的职场感悟吧.不值钱的软件人才 精力充沛与事业成功   让系分来得更猛烈 ...

  8. 2006上半年程序员级试题答案

    2006上半年程序员级试题答案 上午(每空1分) (1) A (16) C (31) A (46) D (61) C (2) D (17) C (32) C (47) B (62) A (3) D ( ...

  9. php程序员笔试题库,2017年初级PHP程序员笔试题

    2017年初级PHP程序员笔试题 即将面临毕业的准毕业生们是不是在为工作发愁了?下面是百分网小编精心为大家整理的2017年初级PHP程序员笔试题,希望对大家有帮助,更多内容请关注应届毕业生网! 一.基 ...

最新文章

  1. 基于Charlieplexing算法(查理复用算法)的LED矩阵控制设计
  2. HQL中的Like查询需要注意的地方
  3. 通过反射获取带参构造方法并使用
  4. 实战渗透-Shiro反序列化漏洞实例
  5. Python中import模块的两种模式
  6. 【总结】升级Xcode8遇到的问题及解决方案!!! [转]
  7. FZU Problem 2030 括号问题
  8. An Energy-Efficient Ant-Based Routing Algorithm for Wireless Sensor Networks (无线传感网中基于蚁群算法的能量有效路由)2
  9. android 图片放大缩小_贴在手机上的显微镜,轻松放大400倍,化身“蚁人”玩转微观世界...
  10. 【BZOJ2251】[2010Beijing Wc]外星联络 后缀数组
  11. 随想录(程序员的缺点)
  12. php inqude函数,Python匿名函数(lambda函数)
  13. 通过计算机和网络进行整个商务贸易活动,电子商务概论
  14. SAP中检验计划创建晚于检验批导致无法质检的问题分析处理
  15. 致远项目管理SPM系统案例:中建二局项目管理系统
  16. 输入需求自动生成代码,这个AI有点厉害,可以替代真人吗?
  17. CISCO WLC的配置备份与导入
  18. emlog模板开发基础2022最新指南
  19. 计算机三级信息安全技术知识点总结(6)
  20. 论文人强烈推荐必备的几个中英文文献网站

热门文章

  1. 跟着Nat Commun学作图 | 4.配对箱线图+差异分析
  2. Linux搭建PHP+MySQL+Apache环境
  3. nvidia-smi简介及各参数的详解与字段的详解和使用
  4. 电脑屏幕录像软件 OBS Studio
  5. linux arp 工具下载,linux如何ARP嗅探 Linux下嗅探工具Dsniff安装记录(示例代码)
  6. Android java到Kotlin的基本语法
  7. python 希尔伯特变换_Python在信号与系统中的应用(1)——Hilbert变换,Hilbert在单边带包络检波的应用,FIR_LPF滤波器设计,还有逼格高高的FM(PM)调制...
  8. SSL协议的分析和实现
  9. 启迪国信灵通入选2016首都设计提升计划
  10. 组件通信、传值(父子、爷孙、多层级)(prop、$emit、provide、inject)(vue)