论坛首页 招聘求职论坛

面试题:农夫养牛问题

浏览 7636 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-10-02  

今天在群中,有人说到这个一个面试题:

一头母牛在3—10岁的时候每年可以生一头小牛,生公牛和母牛的比率是50%,在牛12岁的时候就送入屠宰场买了。现在有一个农夫有1头1岁大的母牛,在母牛3岁的时候就送到附近的农场去配种,请问40年后这个农夫可能会有多少头牛,写出相关的代码或答题思路,最好用面向对象。

polaris将代码(Java实现)写了一下,如有不对的地方欢迎指出。同时也欢迎您给出自己的解法。

package com.polaris.test;

import java.util.*;

/**
 * 问题描述:
 * 
 * 一头母牛在3—10岁的时候每年可以生一头小牛,生公牛和母牛的比率是50%,
 * 在牛12岁的时候就送入屠宰场买了。现在有一个农夫有1头1岁大的母牛,
 * 在母牛3岁的时候就送到附近的农场去配种,请问40年后这个农夫可能会有多少头牛,
 * 写出相关的代码或答题思路,最好用面向对象。
 * @author polaris http://www.beijixing001.com
 * @version 1.0
 */
public class ComputeCattleNum {
	
	// 保存所有母牛
	private static List<Cattle> cows = new ArrayList<Cattle>();
	
	// 保存所有当前农夫拥有的牛
	private static List<Cattle> cattles = new ArrayList<Cattle>();
	
	public static void main(String[] args) {
		// 第一头母牛
		Cattle cow = new Cattle(0,3);
		cows.add(cow);
		
		// 40年
		for(int i=0;i<40;++i) {
			// 大于等于12岁的牛送到屠宰场卖掉;同时每年,所有的牛
			for(int j=0;j<cattles.size();++j) {
				Cattle temp = cattles.get(j);
				if(temp.getDead()) {
					cattles.remove(temp);
				}
				
				// 开始只有一头母猪,年龄不生长
				if(i>0) {
					cattles.get(j).grow();
				}
			}
			
			// 母牛生小牛
			for(int j=0;j<cows.size();++j) {
				Cattle calf = cows.get(j).bear();
				if(calf!=null) {
					if(calf.getSex()==0)
						cows.add(calf);
					cattles.add(calf);
				}
			}
		}
		
		System.out.println("40年后农夫拥有" + cattles.size() + "头牛");
	}
}

class Cattle {
	
	// 牛的雌雄:0代表雌,1代表雄
	private int sex;
	// 牛的年龄
	private int age;
	// 是否卖掉(已死)
	private boolean dead = false;
	
	public Cattle(int sex, int age) {
		this.sex = sex;
		this.age = age;
	}
	
	/**
	 * 生小牛
	 * @return 生出的小牛
	 */
	public Cattle bear() {
		Cattle calf = null;
		if(this.sex==0) {
			if(this.age>=3 && this.age<=10) {
				calf = new Cattle(random(),0);
			} else {
				//System.out.println("抱歉,此牛太小或太老,不能生育。");
			}
		} else {
			//System.out.println("有没有搞错,公牛也想让它生小牛?");
		}
		return calf;
	}
	
	private int random() {
		return (int)Math.round(Math.random());
	}
	
	/**
	 * 长大一岁,如果当前大于等于12岁,则卖掉
	 */
	public void grow() {
		if(this.age>=12) dead = true;
		else this.age++;
	}
	
	public int getSex() {
		return this.sex;
	}
	
	public boolean getDead() {
		return this.dead;
	}
}
 点击此处获得ComputeCattleNum.java类文件

   发表时间:2010-10-02  
polaris威武,我也要加群,求群号
0 请登录后投票
   发表时间:2010-10-02  
cch123 写道
polaris威武,我也要加群,求群号

呵呵。那个群不是专门讨论面试题之类的,只是一个一般的群,有人在里面问到一个题目而已。呵呵
0 请登录后投票
   发表时间:2010-10-08  
没看清题目,还以为要考虑公母配对的问题。我觉得lz答的不错
0 请登录后投票
   发表时间:2010-10-08   最后修改:2010-10-08
Lz答得很好。个人觉得有些地方可以优化。

觉得楼主程序中定义的  // 保存所有母牛 
    private static List<Cattle> cows = new ArrayList<Cattle>(); 
可以不用,然后修改一下40年for循环中的第一个for循环
for(int j=0;j<cattles.size();++j)
这样只要在40年的for循环中使用一次for循环即可解决问题。

0 请登录后投票
   发表时间:2010-10-08   最后修改:2010-10-08
上班第一天,无心工作,我也养牛玩...
好像很简单,不知道对不对哦...
public class Cow {
	
	private boolean isCow;
	private int age;
	private boolean alive;
        ......


public class CountCow {
	
	private static int year = 40;
	private static List<Cow> cows = new ArrayList<Cow>();

	public static void main(String[] args) {

		Cow cow = new Cow();
		cow.setAge(1);
		cow.setAlive(true);
		cow.setCow(true);
		cows.add(cow);
		
		for(int i = 1; i <= year; i ++){
			
			List<Cow> tmp = new ArrayList<Cow>();
			
			for(Cow c : cows){
				
				if(c.getAge()>=3 && c.getAge() <=10 && c.isCow()){
					
					Cow cc = new Cow();
					cc.setAge(0);
					cc.setAlive(true);
					cc.setCow(isCow());
					tmp.add(cc);
				}
				
				if(c.getAge() < 12){
					
					c.setAge(c.getAge()+1);
					tmp.add(c);
				}
			}
			cows.clear();
			cows.addAll(tmp);
			System.out.println(cows.size());
		}
		System.out.println("="+cows.size());
	}
	
	private static boolean isCow(){
		
		Random random = new Random();
		return random.nextInt(10) % 2 == 0;
	}

}

反复运行好多好多遍。。。
最小值 624
最大值 10687
足足相差17倍!!!

真的是人的命天注定呢!你说,都是养牛的,找谁说理去!!!

哎,终于下班了。。。

又转了几遍,还出现0值了!!!!
每年结果如下:
1
1
2
3
4
5
6
7
8
9
9
8
8
8
8
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
=0
没天理啊!!!

走了!
0 请登录后投票
   发表时间:2010-10-08  
import java.util.ArrayList;
import java.util.List;

public class Farm {	
	public List<Cow> cows = new ArrayList<Cow>();

	public void firstCow() {
		Cow fc = new Cow(0);
		fc.setAge(3);		
		cows.add(fc);
	}

	public int forgrow() {
		firstCow();
		for (int i = 0; i < 40; i++) {
			int k = cows.size();
			for (int j = 0; j < k; j++) {
				Cow cow = cows.get(j);				
				if (cow.sell()) {
					cows.remove(j);
				} else {
					if (cow.getSex() == 0 && cow.getAge() >= 3) {
						int sex = cow.prow();
						cows.add(new Cow(sex));
						cow.grow();
					} else {
						cow.grow();
					}
				}				
			}
		}
		return cows.size();
	}
	
	public static void main(String[] args) {
		System.out.println(new Farm().forgrow());
	}
}

public class Cow {

	private int age = 0;

	public int getAge() {
		return age;
	}

	private int sex = 0;	

	public int getSex() {
		return sex;
	}

	public void setSex(int sex) {
		this.sex = sex;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public void grow() {
		age++;
	}

	public boolean sell() {
		return (age == 12);
	}

	public boolean enough() {
		return age > 3;
	}
	
	public int prow() {
		return (int) (Math.random() * 2);
	}
	
	public Cow(int sex) {
		this.sex = sex;
		this.age = 1;
	}
}


菜鸟发着玩  轻喷

PS: 喷也无所谓, 我脸皮厚
0 请登录后投票
   发表时间:2010-10-08  
引用

# public Cattle bear() { 
#         Cattle calf = null; 
#         if(this.sex==0) { 
#             if(this.age>=3 && this.age<=10) { 
#                 calf = new Cattle(random(),0); 
#             } else { 
#                 //System.out.println("抱歉,此牛太小或太老,不能生育。"); 
#             } 
#         } else { 
#             //System.out.println("有没有搞错,公牛也想让它生小牛?"); 
#         } 
#         return calf; 
#     } 




这段应聘外企可加分。
0 请登录后投票
   发表时间:2010-10-08  
yangguo 写道
引用

# public Cattle bear() { 
#         Cattle calf = null; 
#         if(this.sex==0) { 
#             if(this.age>=3 && this.age<=10) { 
#                 calf = new Cattle(random(),0); 
#             } else { 
#                 //System.out.println("抱歉,此牛太小或太老,不能生育。"); 
#             } 
#         } else { 
#             //System.out.println("有没有搞错,公牛也想让它生小牛?"); 
#         } 
#         return calf; 
#     } 




这段应聘外企可加分。


呵呵。谢谢。你最近没写啥啊?想看看你大牛写的东西呢。呵呵
0 请登录后投票
   发表时间:2010-10-08  
hikaru1012 写道
Lz答得很好。个人觉得有些地方可以优化。

觉得楼主程序中定义的  // 保存所有母牛 
    private static List<Cattle> cows = new ArrayList<Cattle>(); 
可以不用,然后修改一下40年for循环中的第一个for循环
for(int j=0;j<cattles.size();++j)
这样只要在40年的for循环中使用一次for循环即可解决问题。


当时写主要是想实现功能,没有过多考虑优化的问题。呵呵
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics