今天看马士兵老师的视频,看见了一个有点意思的面试题,农场与母牛
?
题目是这样的:
?
农场一头小母牛,
?母牛五岁产母牛,
?每年生头小母牛,
?二十年有多少牛。
?
看到此题,我的第一反应就是递归啊、函数什么的。接着老师说了一句:“请不要先把思维陷入到算法里,先用面向对象的思维来考虑……”。 这时,我才突然反应过来,我的面向过程思维根深蒂固,面向对象思维还需加强呐!同时,由于换了个思维,所以这道题也勾起了我的兴趣,于是着手实现起来…
?
?
?
import java.util.Vector;
public class Farm {
private Vector<Cow> cows=new Vector(); //农场的牛群,用vector盛放
private int count=0; //农场的总牛数
//得到总牛数
public int getCount() {
count=cows.size();
return count;
}
//增加一头牛
public void addCow(){
this.cows.addElement(new Cow());
}
//农场进入下一年,满了5岁的牛就产崽并长一岁,没满的就只长一岁
public void nextYear(){
Cow c=new Cow();
int before=cows.size();
for(int i=0;i<before;i++){
c=cows.elementAt(i);
if(c.getAge()>=5){
c.grow();
c.lay(this);
}
else{
c.grow();
}
}
}
//为了显示方便,我就直接把main写在Farm类里面了
public static void main(String [] args){
Farm farm=new Farm();
farm.addCow();
for(int i=1;i<=20;i++){
farm.nextYear();
System.out.println("第 "+i+"年有牛 :"+farm.getCount());
}
}
}
?
?
?? ?//母牛类
public class Cow {
private int age;
public Cow(){
this.age=0;
}
public void grow(){
this.age++;
}
public int getAge(){
return age;
}
public void lay(Farm f){
f.addCow();
}
}
?
?
输出结果:
? ? ?第 1年有牛 :1
第 2年有牛 :1
第 3年有牛 :1
第 4年有牛 :1
第 5年有牛 :1
第 6年有牛 :2
第 7年有牛 :3
第 8年有牛 :4
第 9年有牛 :5
第 10年有牛 :6
第 11年有牛 :7
第 12年有牛 :9
第 13年有牛 :12
第 14年有牛 :16
第 15年有牛 :21
第 16年有牛 :27
第 17年有牛 :34
第 18年有牛 :43
第 19年有牛 :55
第 20年有牛 :71
?
?
?
在纸上推了一下,貌似是对的。
?
?
题目不难,但是有一些细节如果没注意的话,还是会很恼人,牛是在第5岁的时候产下崽还是第6岁的时候把崽产下来,比如刚生下来的崽是0岁而不是1岁,对象的引用,等。
?
所以,虽然简单,也还是花了我一些时间的~ 在这里放出来,除了是为了留给我以后回忆和供其他爱好者学习之外,同时也是为了抛砖引玉,希望看到有人提出更好的解决模式或者指出我设计得不好的地方,在交流中进步嘛~~