【程序员思维】用两个鸡蛋判断鸡蛋在多少楼层扔下不会碎

题目:如果你有两个鸡蛋,并且想搞清楚在不摔破鸡蛋的前提下最高能从多高的地方往下扔鸡蛋,你会采取怎样的做法?最优的解决方案是哪种?

解题思维:如果鸡蛋刚好在n层碎掉,那么说明鸡蛋在n-1层不会碎。

设 楼层高度为m层 ,先用第一个鸡蛋在m/2层扔下

1)如果碎掉,即最坏可能,第二个鸡蛋只能从1层到(m/2-1)层继续依次扔下,测试刚好碎掉的楼层n,这样需要操作n次

2)如果未碎掉,则我们再将第一个鸡蛋,再从m/2到m层的中间层进行抛下,重复操作,缩短楼层范围。

代码实现:参考二分法

package test;

import java.util.Date;

public class Eggs {

	public int n;//碎鸡蛋楼层
	
	boolean isBreak(int m){//判断鸡蛋在m层扔下是否碎掉
		  if(m>=n){
		     return true;
		  }
		   return false;
		}

	int trowsEggs(int p,int q){//楼层范围p-->q 
	   int mid=(p+q)/2;
	   if(isBreak(mid)){//在中间层抛下第一个鸡蛋,判断是否碎掉
	      for(int i=p;i<mid;i++){
	         if(isBreak(i)) {
	        	 return i-1;
	         }
	      }
	   }
	   return trowsEggs(mid,q);//未碎,缩短判定范围
	}
	
	public static void main(String[] args) {
		Eggs egg=new Eggs();
		egg.n=(int)((Math.random())*29999999+1);//随机碎鸡蛋楼层
		long time1=new Date().getTime();
		int j=egg.trowsEggs(1, 30000000);//计算所得楼层
		long time2=new Date().getTime();
		System.out.println("鸡蛋在"+j+"层不会摔碎,耗时:"+(time2-time1)+"ms");
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值