最近刚换工作,面试必然要考算法,搞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>