经典基础算法之面试题(系列一)转bizhu

伦敦奥运会火热进行中,让我们来看个打靶的问题:一个射击运动员打靶,靶一共有10环,求连开10枪打中90环的可能行有多少种?分析:这是一个典型递归求解问题。假设第10枪打x环,则将问题转换为剩下9枪打90-x环的可能有多少种,x的取值范围为[0, 10],根据加法原理,则:10枪打90环的可能 = 第10枪打0环,剩下9枪打90环的可能 + 第10枪打1环,剩下9枪打89环的可能 + 第10枪打2环,剩下9枪打88环的可能 + 第10枪打3环,剩下9枪打87环的可能 + 第10枪打4环,剩下9枪打86环的可能 + 第10枪打5环,剩下9枪打85环的可能 + 第10枪打6环,剩下9枪打84环的可能 + 第10枪打7环,剩下9枪打83环的可能 + 第10枪打8环,剩下9枪打82环的可能+ 第10枪打9环,剩下9枪打81环的可能 + 第10枪打10环,剩下9枪打80环的可能。

递归的停止条件为:1. 若环数小于0 或者 剩下的环数大于剩下的枪数乘以10(即剩下每枪打10环用不玩所剩环数),则该递归路径不记入可能情况。2. 若不满足条件1,且所剩枪数为1,则该递归路径记为1中可能情况。

求x的p次幂本是简单的问题,可以将x次乘p次就可以了,这里我们当然不是要讨论这种计算方法,这里讨论的是怎样高效计算。有没有可能减少做乘法的次数呢?让我们来做一个分析,考虑x的6次幂的情况:x * x * x * x * x * x = (x * x * x) * (x * x * x)等式前面部分需进行6次乘法,后半部分需计算(x * x * x) ,然后乘以上次计算的值即可,共4次乘法。通过上述分析可知,求x的p次幂可以通过递归折半的方法来减少乘法的次数,循着这个思考,实现就不太困难了。

计算2的20次幂总共进行5次乘法就足够了,而原始的算法需要20次,那么这种算法究竟需要多少次乘法呢?由于该算法根本思想是折半递归,类似于2分查找,所以乘法的次数为lgp取天花板值这个数量级的(lgp表示以2为底p的对数)。整型int最多表示2的32次幂,因此最多节省24次乘法,对于现代的计算机,这似乎不是特别重要,但是在以下情况下该算法具有重要价值:1. 对于需要高频率计算幂的情况;2. 对于大数高精度计算的情况,如需计算2的10000次幂。当然了,这也是对递归算法和2分法的巧妙应用,学习其思想吧。

和这个问题类似的问题还有:1. 给定某年某月某日,问这是这年的第多少天?2. 已知某年的1月1号是星期几,求给定的某年某月某日是星期几?

其实这类问题的共同点在于它们都需要考虑闰年问题,大月小月问题;首先我们解决闰年问题,根据闰年的定义定义如下宏来判断某年是否是闰年:#define IS_LEAP(X) (((X) % 400 == 0 || (X) % 100 != 0 && (X) % 4 == 0) ? 1 : 0)

在来看大月小月问题,可以定义如下二维数组,用day_count_of_month[0][12]表示润年情况下每月的天数,用day_count_of_month[1][12]表示非润年情况下每月的天数(这就是传说中的字典法了,就是根据提供的信息查表,类似于查字典,所以叫做字典法):int day_count_of_month[2][12] = {

{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},                                                 {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}

};

上面这段代码解决了第一个问题,第二个问题可以转换为类似第一个问题的问题:先计算给定的某年某月某日到给定已知这天的总天数s=>s%7=>利用模运算结果来推算所求日期的星期情况即可。

THE END
0.1908年伦敦奥运会不过,这些小小的麻烦不足以影响伦敦奥运会成为奥运史上初具规模的大赛。从1908年4月起,两千多名运动员聚集到伦敦,开始了长达半年的马拉松式角逐[2]。 2参赛队伍 编辑 本届参赛国家共22个,运动员2034人,其中女子36人,总人数比前三届的总和还要多,东道主派出了最庞大的选手团,达710人;法国次之220人;瑞典156人jvzquC41dcolg7xqiq{/exr1ngsnc8XjqyOopnwNkpq/j}rAvkzmgF6;2:+F7.G;'D:&G=*DE'G7'N;';7+B8.J7'C;&C>*G:'HG'B5'G6+CE.>C
1.小窗幽记全本阅读小窗幽记最新章节阅读开幕式在成都东安湖体育公园主体育场举行,央视解说团队对仪式流程、文艺表演及中国代表团入场环节进行了专业解说。 奥运会2024年几月几号几点开始 年奥运会将在法国巴黎举办,举办时间为2024年7月29日至8月12日。其他未来奥运会的举办时间和地点如下:2025年奥运会将在埃及举办,举办时间为2025年8月1日至8月12日;jvzq<845i0vyfnmi0eun1ktqm1;68>645:<50qyon
2.乱乱自拍视频,独家私密瞬间大揭秘,高清画质让你身临其境,揭秘网红2008年奥运会是几月几号几点 542.19MB 12%好评9764人) 免费看裸美女虐乳的视频 美女被狂揉下部麻豆 韩国同性做爰2 751.26MB 59%好评3011人) 中国大屄如:人糖日屄视频 咒术回战钉崎野蔷薇壁纸竖屏 打屁股大全 详情 乳晕粉嫩嫩的奶头粉嫩嫩的 无码人妻一区二区三区AⅤ抖音 详情 丫头小嫩缝好紧进不去 女同性做 jvzq<84o0jkggr3fivpid7hp1ciu1wjyu1=73::;0jzn
3.“08年奥运会阿根廷男篮”相关内容介绍、详解,“08年奥运会阿根廷星女园为大家带来有关“08年奥运会阿根廷男篮”相关内容介绍、详解,了解更多有关“08年奥运会阿根廷男篮”的内容请关注星女园jvzquC41yy}/upnzz0io1}fi16>829>0jvsm
4.关于08年奥运的记忆,不止有屡创佳绩的运动员,还有那一届地产商“2008年,那时的我以为,在北京能举办一届奥运会,是我们的荣耀。 2021年,现在的我感觉,拥有北京那样一届奥运会,是奥林匹克的荣耀。” 2008年之于奥运,依然“一剑光寒十九州”。 千人击缶,万人高歌。 那一年,留给房地产行业的印记,也同样纵横三万里。 jvzquC41zwkrk~3eqo528?>693?6986;59:46:>
5.雅典奥运会八分钟为什么被骂(2000年雅典奥运会上的“中国8分钟是2004年雅典奥运会2004年8月29日,雅典奥运会闭幕式上,中国小姑娘在大红灯笼的造型上,唱起一曲《茉莉花》,打动在场的所有观众。这是张艺谋导演为08年奥运会开幕式进行的8分钟的预演。 一个5岁的可爱小女孩,在广为流传的中国民歌《茉莉花》的歌声中,从一个大红灯笼上用一句英文“Welcome to Beijing”向世界发出jvzquC41kplptnwc0eun1jwvkerf1=8;;54ivvq