背景是一道面试题
有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
写出计算第五个人多大的,过程(java)
如果这个题目给一个小学生,他也能很快做出来。大学生就不用说了,总结一下规律,比如一个等差数列几行代码就能解决问题。但要是你实现后面试则说其中一个说他说错了,是大3岁,而打破这种规则,你又如何处理呢。
这里就不对上诉做法进行任何说明。仅针对该类问题做一些分析。看下面关系
5-->4-->3-->2-->1
是不是一个链表关系,这里我想到了用责任链实现,对于上诉问题变化也能完美扩展,或许这才是面试者的本意。
第二题,可用责任链:
package com.shuidexiongdi.chain.age;
public interface IPerson {
int getAge();
void setNextPerson(IPerson nextPerson);
void setBiggerThanNextPersonAge(int biggerThanNextPersonAge);
}
package com.shuidexiongdi.chain.age;
import org.apache.log4j.Logger;
public abstract class Person implements IPerson {
private Logger logger = Logger.getLogger(Person.class);
private int biggerThanNextPersonAge;
private IPerson nextPerson;
private int myAge;
public final int getAge() {
initMyAge();
if(this.nextPerson != null) {
this.myAge = this.nextPerson.getAge() + this.biggerThanNextPersonAge;
}
logger.info(this.getClass().getName() + " my age is:" + this.myAge);
return this.myAge;
}
public void setNextPerson(IPerson nextPerson) {
this.nextPerson = nextPerson;
}
void initMyAge() {
this.myAge = telYouMyAge();
}
abstract int telYouMyAge();
public void setBiggerThanNextPersonAge(int biggerThanNextPersonAge) {
this.biggerThanNextPersonAge = biggerThanNextPersonAge;
}
}
package com.shuidexiongdi.chain.age;
public class PersonFifth extends Person {
@Override
int telYouMyAge() {
System.out.println("you guess...");
return 0;
}
}
package com.shuidexiongdi.chain.age;
public class PersonFourth extends Person {
@Override
int telYouMyAge() {
System.out.println("you guess...");
return 0;
}
}
package com.shuidexiongdi.chain.age;
public class PersonThird extends Person {
@Override
int telYouMyAge() {
System.out.println("you guess...");
return 0;
}
}
package com.shuidexiongdi.chain.age;
public class PersonSecond extends Person {
@Override
int telYouMyAge() {
System.out.println("you guess...");
return 0;
}
}
package com.shuidexiongdi.chain.age;
public class PersonFirst extends Person {
@Override
int telYouMyAge() {
System.out.println("ok,I tell you! ");
return 10;
}
}
package com.shuidexiongdi.chain.age;
public class Client {
public static void main(String[] args) {
IPerson person5 = new PersonFifth();
IPerson person4 = new PersonFourth();
IPerson person3 = new PersonThird();
IPerson person2 = new PersonSecond();
IPerson person1 = new PersonFirst();
person5.setNextPerson(person4);
person5.setBiggerThanNextPersonAge(2);
person4.setNextPerson(person3);
person4.setBiggerThanNextPersonAge(2);
person3.setNextPerson(person2);
person3.setBiggerThanNextPersonAge(2);
person2.setNextPerson(person1);
person2.setBiggerThanNextPersonAge(2);
person1.setNextPerson(null);
person5.getAge();
}
}
输出结果:
you guess...
you guess...
you guess...
you guess...
ok,I tell you!
2011-08-05 10:10:27 INFO Person[getAge]:21 - com.shuidexiongdi.chain.age.PersonFirstmy age is:10
2011-08-05 10:10:27 INFO Person[getAge]:21 - com.shuidexiongdi.chain.age.PersonSecondmy age is:12
2011-08-05 10:10:27 INFO Person[getAge]:21 - com.shuidexiongdi.chain.age.PersonThirdmy age is:14
2011-08-05 10:10:27 INFO Person[getAge]:21 - com.shuidexiongdi.chain.age.PersonFourthmy age is:16
2011-08-05 10:10:27 INFO Person[getAge]:21 - com.shuidexiongdi.chain.age.PersonFifthmy age is:18
分享到:
相关推荐
在上述的面试题中,面试者需要实现一个名为add的函数,该函数可以实现连续调用并累加求和的功能。例如,add(1)(2)应该返回3,add(1, 2, 3)(10)应该返回16。解决这个问题需要对JavaScript中的函数、函数的构造方法、...
本文将深入探讨一道具有挑战性的iOS面试题,该题目涉及到Objective-C的内存管理、类对象、消息传递以及运行时机制。问题的核心在于如何理解并分析一段看似错误但实际上可以正确运行的代码。 首先,让我们回顾一下...
这篇资料主要涵盖的是C语言和C++编程面试中的一些...思考题部分,Test函数会引发程序崩溃,原因在于GetMemory函数内申请的动态内存没有正确传递给Test函数外部的str,导致strcpy尝试在NULL指针上操作,引发未定义行为。
2. **抽题**:考生通过计算机系统随机抽取试题,并选择一道进行准备。 3. **备课**:考生在20分钟内撰写教案或演示活动方案。 4. **回答规定问题**:考生需回答考官从题库中抽取的2个问题,限时5分钟。 5. **试讲/...
java餐饮管理系统源码加数据库 优秀文章集 KOA2框架原理解析和实现 ...一次内联元素错位引发对line-height的思考...从一道面试题说起—js隐式转换踩坑合集 CSS实现元素居中原理解析 前端骨架屏方案小结 Typescript配合Reac
“金刚坐飞机问题”不仅是一道考察逻辑思维与概率计算能力的经典面试题,更深层次地,它揭示了在面对不确定性和规则破坏者时,个体及群体如何做出反应,以及这些反应背后蕴含的概率学原理。通过这道题目,我们不仅...