关于一个算法题的想法:1000瓶汽水,每喝3瓶赚一瓶,最终喝了多少瓶,剩几个空瓶?
最近刚换工作,面试必然要考算法,搞BS架构的信息管理系统好几年了,面算法时那叫一个痛苦。。。。
所以最近看见算法就想研究下,刚才在首页上看到一个哥们写的一个酒瓶算法。所以拿来练练手。
新机器,还没装编程环境,用记事本写的html测试。凑活着看吧。
共有1000瓶汽水 * 每喝完后一瓶得到的一个空瓶子 * 每3个空瓶子又能换1瓶汽水,喝掉以后又得到一个空瓶子,问总共能喝多少瓶汽水,最后还剩余多少个空瓶子?
<html> <head> <script type="text/javascript"> //计时函数 function TimerRecord(){ this.array=[]; this.begin=function(){ this.array.push(new Date()); } this.end=function(){ if(this.array.length==0)throw 'begin()和end()要成对的调用'; var end=new Date(); var start=this.array.pop(); return end-start; } } var tr=new TimerRecord(); //方法1 -递归 function HeQiShui(PingCount) { tr.begin();//开始计时 var AllHe=0; function getAll(KongPing) { if(KongPing<3) return KongPing; else { var He=parseInt(KongPing/3);//这一轮喝了多少瓶 AllHe+=He; var NextKongPing=He+KongPing%3;//这轮剩下多少空瓶 return getAll(NextKongPing); } } var qs=PingCount*3; var b=getAll(qs);//先假设初始的瓶子是3倍的空可乐瓶换来的,传给getAll,因为getAll只收空瓶数 var endtime=tr.end();//计时结束 alert("喝了"+AllHe+",还剩空瓶:"+b+",用时:"+endtime); } //方法2 -循环 function HeQiShui2(PingCount) { tr.begin();//开始计时 var AllHe=0;//一共喝了多少 var KongPing=PingCount*3;//当前有几个空瓶,先假设初始的瓶子是3倍的空可乐瓶换来的 while(KongPing >= 3){ var He=parseInt(KongPing/3);//这一轮喝了多少瓶 AllHe+=He; KongPing=He+KongPing%3;//这轮剩下多少空瓶 } var endtime=tr.end();//计时结束 alert("喝了"+AllHe+",还剩空瓶:"+KongPing+",用时:"+endtime); } //方法3 -加减法-效率略慢 function HeQiShui3(PingCount) { tr.begin();//开始计时 var qs= PingCount; var kp = 0; //空瓶 var hd = 0; //喝掉 while(qs >= 1){ kp++; if(kp == 3){ qs++; kp=0; } hd++; qs--; } var endtime=tr.end();//计时结束 alert("喝了"+hd +",还剩空瓶:"+kp +",用时:"+endtime); } </script> </head> <body> /* * 题目1:共有1000瓶汽水 * 每喝完后一瓶得到的一个空瓶子 * 每3个空瓶子又能换1瓶汽水,喝掉以后又得到一个空瓶子,问总共能喝多少瓶汽水,最后还剩余多少个空瓶子? * */ <br /> <a href="javascript:HeQiShui(10000000)">测试喝汽水算法,递归</a> <br /> <a href="javascript:HeQiShui2(10000000)">测试喝汽水算法,循环</a> <br /> <a href="javascript:HeQiShui3(10000000)">测试喝汽水算法,没有除法和求余,只有加减</a> </body> </html>