#牛客堂直播视频#斐波那契数列(2015.7.22)

【本期题目】 
1、斐波那契系列问题的递归和动态规划
【题目】
给定整数N,返回斐波那契数列的第N项。
【补充题目1】
给定整数N,代表台阶数,一次可以跨2个或者1个台阶,返回有多少种走法。
【举例】
N=3。可以三次都跨1个台阶;也可以先跨2个台阶,再跨1个台阶;还可以先跨1个台阶,再跨2个台阶。所以有三种走法,返回3。
【补充题目2】
假设农场中成熟的母牛每年只会生1头小母牛,并且永远不会死。第一年农场有1只成熟的母牛,从第二年开始,母牛将开始生小母牛。每只小母牛3年之后成熟又可以开始生小母牛。给定整数N,求出N年后牛的数量。
【举例】
N=6。第1年1头成***牛记为a。第2年a生了新的小母牛记为b,总牛数为2。第3年a生了新的小母牛记为c,总牛数为3。第4年a生了新的小母牛记为d,总牛数为4。第5年b成熟了,a和b分别生了新的小母牛,总牛数为6。第6年c也成熟了,a、b和c分别生了新的小母牛,总牛数为9。返回9。

2、换钱的方法数
【题目】
给定数组arr,arr中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法。
【举例】
arr=[5,10,25,1],aim=0。
组成0元的方法有1种,就是所有面值的货币都不用。所以返回1。
arr=[5,10,25,1],aim=15。
组成15元的方法有6种,分别为3张5元,1张10元+1张5元,1张10元+5张1元,10张1元+1张5元,2张5元+5张1元,15张1元。所以返回6。
arr=[3,5],aim=2。
任何方法都无法组成2元。所以返回0。

注:下面回帖给出了源代码供参考。

【分享嘉宾介绍】
左程云
华中科技大学本科--计算机科学与技术专业、 芝加哥大学硕士--计算机科学专业
IBM软件工程师、 百度软件工程师、 刷题5年的算法热爱者
《程序员代码面试指南--IT名企算法与数据结构题目最优解》 作者,电子工业出版社7月底将出版发行,书籍涉及算法与数据结构编程题目240道以上,并且个人实现出最优解,大部分题目为面试高频题

【参与牛客堂直播】
每周三晚8:00~9:30,直播页面http://www.nowcoder.com/live/courses

【直播题目讨论】
加入牛客5群272820159
全部评论
本期答案领取地址:  加入牛客讨论2群(244930442 ) 群资料中文件:2015-07-22正式版.pdf
点赞 回复 分享
发布于 2015-07-23 17:39
讲的很好。收获很大
点赞 回复 分享
发布于 2017-08-11 17:45
现在还能看吗?
点赞 回复 分享
发布于 2017-04-08 12:25
受教,学习了
点赞 回复 分享
发布于 2016-09-27 20:39
不错
点赞 回复 分享
发布于 2016-08-07 16:16
程云大师真牛,
点赞 回复 分享
发布于 2015-12-10 08:26
xiexie
点赞 回复 分享
发布于 2015-11-29 19:55
非常好
点赞 回复 分享
发布于 2015-10-16 21:25
good
点赞 回复 分享
发布于 2015-10-09 13:43
左神,求答案~
点赞 回复 分享
发布于 2015-09-30 09:20
是不是递推式一样,系数矩阵中的数就确定了,跟具体每一项的数值无关a
点赞 回复 分享
发布于 2015-09-23 00:06
讲的很清楚啊
点赞 回复 分享
发布于 2015-09-20 14:54
public class SplitMoney { int[][] table = new int[5][3001]; public static void main(String[] args) { int[] arr = new int[]{5,10,25,1}; int aim = 3000; SplitMoney splitMoney = new SplitMoney(); long time1= System.currentTimeMillis(); System.out.println(splitMoney.splitSearchTable(arr,0,aim)); long time2= System.currentTimeMillis(); System.out.println("search table method time (ms):"+(time2-time1)); time1= System.currentTimeMillis(); System.out.println(splitMoney.splitRecursive(arr, 0, aim)); time2= System.currentTimeMillis(); System.out.println("recursive method time (ms):"+(time2-time1)); } public int splitRecursive(int[] arr,int start,int aim){ if(arr==null|| arr.length==0 || aim<=0){ return 0; } return splitProcess(arr,start,aim); } public int splitProcess(int[] arr,int start,int aim){ int sum =0; if(aim==0){ return 1; } if(start==arr.length){ return 0; } else{ while(aim>=0){ sum+=splitProcess(arr, start + 1, aim); aim = aim-arr[start]; } } return sum; } public int splitSearchTable(int[] arr,int start,int aim){ if(arr==null|| arr.length==0 || aim<=0){ return 0; } return splitProcess1(arr, start, aim); } public int splitProcess1(int[] arr,int start,int aim){ int sum =0; if(aim==0){ table[start][aim]=1; return 1; } if(start==arr.length){ return 0; } else{ while(aim>=0){ if(table[start][aim]!=0){ sum += table[start][aim]; } else { sum += splitProcess1(arr, start + 1, aim); } aim -=arr[start]; } } if(aim>=0){ table[start][aim] = sum; } return sum; } } 分钱的那道题: 为什么我的程序跑出来的结果是: 3681531 search table method time (ms):13912 3681531 recursive method time (ms):3049 按照常理来讲应该记忆化搜索比暴力递归的时间要短啊。谁能帮我看一看这个是为什么?
点赞 回复 分享
发布于 2015-09-18 15:51
nice啊
点赞 回复 分享
发布于 2015-09-15 10:42
那个矩阵乘法,有点像线性代数里面的题目,用正交化
点赞 回复 分享
发布于 2015-09-13 17:58
在其他地方没有学到过这些
点赞 回复 分享
发布于 2015-09-11 20:18
老师讲的真好  
点赞 回复 分享
发布于 2015-09-10 16:32
为什么看不了?
点赞 回复 分享
发布于 2015-09-04 20:09
回帖可以看?
点赞 回复 分享
发布于 2015-09-03 19:23
讲得很好,涨姿势了
点赞 回复 分享
发布于 2015-09-03 16:30

相关推荐

作为带过好几个实习生的老mentor,我见过有同学带着一腔热血来实习,最后却只带走一份单薄的履历。实习,是你从学校到职场最关键的过渡期,它的价值远不止一份实习证明。今天,我不讲大道理,就从我作为Mentor的视角,给你们几条能立刻用上的建议。记住,你的目标不是当个好学生,而是成为一个值得信赖的职场新人。一、&nbsp;心态转变:从被动答题到主动解题这是我最想强调的一点。学生思维是:等待老师布置明确的作业,然后完成它。职场思维是:主动发现模糊的问题,然后解决它。反面事例:接到任务后,埋头就做,遇到困难不吭声,直到截止日期才说“这个我不会”。Mentor期待的是啥呢?首先是确认目标:接到任务后,先用自己的话复述一遍:“我理解这个任务是要达成XX效果,对吗?”&nbsp;确保方向没错。然后是主动思考:不要只带问题来,要带“选择题”。问“这个数据我不会查,我尝试了A和B方法都失败了,您看是方法C更合适,还是我有其他没考虑到的渠道?”&nbsp;这证明了你的思考和努力。最后是闭环思维:任务完成后,主动告知结果:“XX任务已完成,数据/文件已发您邮箱,并同步在团队网盘了。其中有个小发现是……,供您参考。”&nbsp;让一切有始有终。二、&nbsp;沟通方式:实习生的很多错误,都源于“想当然”和“不敢问”。反面教材:在做一个PPT时,因为不确定公司模板,就套用了自己觉得好看的模板,结果不能用。那么怎么确认,怎么提问呢?第一个,不懂就问,但别重复问:第一次问,是学习;同样的问题问第三次,就是不用心。准备一个笔记本,把关键信息、操作流程、注意事项都记下来。第二个,及时汇报,别等追问:特别是遇到卡壳或可能延期时,一定要提前说。Mentor不怕你慢,就怕你失联。没事儿更新一下进度:目前已完成80%,但在XX环节遇到点阻力,正在想办法沟通等回复,预计今天下班前确定结果,到时候给您,这样说能让人极度安心。第三个,珍惜1on1机会:和Mentor的定期沟通,不是你被动接受批评,而是你主动获取信息和反馈的黄金时间。提前准备好:a)&nbsp;本周工作进展;b)&nbsp;遇到的困惑/挑战;c)&nbsp;希望学习的新技能;d)&nbsp;对团队业务的任何好奇。三、&nbsp;工作习惯:&nbsp;专业性体现在细节里职业素养不是空话,它藏在每一个你容易忽略的细节中。1.&nbsp;邮件/沟通软件礼仪:邮件:标题清晰(如【实习生XX-XX项目周报】),正文称呼得体,结尾有落款。别用“在吗?”开头。工作群:别发表情包刷屏,沟通事情简明扼要。收到任务或通知,回复“收到,谢谢”,这是基本的确认和尊重。2.&nbsp;文件管理与命名:我会观察实习生的桌面,看他们的使用习惯,乱糟糟的桌面说明他没条理。文件命名要使用统一的命名规则:日期_项目名_内容_版本_姓名。例如:20231027_秋招海报_初版_张三。这能为整个团队节省大量沟通成本。3.&nbsp;对待杂活的态度:复印、整理数据、会议纪要……这些dirty&nbsp;work是不可避免的。但优秀的人是能从中找到价值的:整理数据时,可以留意数据之间的关联或异常,做会议纪要时,可以梳理出会议的决策和待办事项。四、&nbsp;终极目标:带走三样东西1.&nbsp;一段能讲出STAR法则的实战经历:这直接决定了你未来求职简历的厚度。2.&nbsp;一位可以为你未来背书的Mentor/同事:好好表现,离职时保持联系,他们可能成为你未来求职的推荐人和内推渠道。3.&nbsp;对行业和岗位的真实认知:通过这次实习,你想清楚自己是更热爱这个行业,还是想赶紧跑路?这个答案,价值千金。最后,作为你们的Mentor,我想说:大胆去试,勇敢去问,别怕犯错。实习期是你犯错成本最低的时候。展现出你的靠谱、主动和思考,我们做Mentor的,会非常乐意把更核心的任务交给你,因为带你,也是在为团队培养未来的战友。希望这些建议能帮你少走弯路,打一场漂亮的实习战!
家族企业:实习一年比在大学多年都有用
第一次找实习,我建议__
点赞 评论 收藏
分享
2025-12-22 16:31
已编辑
桂林电子科技大学 Python
很奥的前端仔:如果你接了offer 临时又说不去 hr确实要多做一些工作。 当然如果是接offer之前当我没说
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务