关于一个算法题的想法: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>

  

转载于:https://www.cnblogs.com/haihan/archive/2011/09/20/2182716.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值