发新话题

月薪三万的一道面试题

小明和小强都是张老师的学生,张老师的生日是M月N日,2人都知道张老师的生日
    是下列10组中的一天,张老师把M值告诉了小明,把N值告诉了小强,张老师问他们知道他的生日是那一天吗?
    3月4日 3月5日 3月8日
    6月4日 6月7日
    9月1日 9月5日
    12月1日 12月2日 12月8日
    小明说:如果我不知道的话,小强肯定也不知道
    小强说:本来我也不知道,但是现在我知道了
    小明说:哦,那我也知道了
    请根据以上对话推断出张老师的生日是哪一天

参考答案:

生日是9月1日

解题思路:

由小明第一句话可知,此月可能为3月或9月。因为6月有个7日,12月有个2日,如果M为6或12的话,小强有可能知道,而小强肯定不知道。
由小强的话可知,此日可能为1日、4日或8日。因为如果N为5的话,小强无法判断是3月5日还是9月5日,而不会说现在我知道了。
由小明第二句话可知,此月必为9月。因为如果是3月,小明无法判断是3月4日还是3月8日,而他说那我也知道了。
综上所述,生日是9月1日。


参考答案:

生日是9月1日
代码大概是:

class begin
{

static void Main()
{
//初始化生日集合

生日集合 srjh=new 生日集合();

srjh.Add(new 生日类(3,4));
srjh.Add(new 生日类(3,5));
srjh.Add(new 生日类(3,8));
srjh.Add(new 生日类(6,4));
srjh.Add(new 生日类(6,7));
srjh.Add(new 生日类(9,1));
srjh.Add(new 生日类(9,5));
srjh.Add(new 生日类(12,1));
srjh.Add(new 生日类(12,2));
srjh.Add(new 生日类(12,8));

//开始工作流

工作流.BEG(srjh);

System.Console.Read();
}


}

//工作流
class 工作流
{
/**//* 开始结点
* ↓
* 结点A:如果我不知道的话 →结点X:小明知道(该节点分支略)
* ↓
* 结点B:小强肯定也不知道
* ↓
* 结点C: 小强说:现在我知道了
* ↓
* 结点D:小明说:哦,那我也知道了
* ↓
* 结束结点
*
*/


public static void BEG(生日集合 obj)
{
if(obj !=null)
{
A(obj);//下一结点
}
}

//结点A:如果我不知道的话
private static void A(生日集合 obj)
{
生日集合 jh=AI.小明分析(obj);

if(jh.Count==0)
{
B(obj); //下一结点
}
else
{
//小明可以光凭月知道的集合
//该节点分支略
}
}

//结点B:小强肯定也不知道
private static void B(生日集合 obj)
{
//得到小强光凭日期就能知道的集合
生日集合 小强知道的集合=AI.小强分析(obj);

//小明之所以知道小强肯定不知道,
//是因为小明知道的月份不是小强光凭日期就能知道的

生日集合 排除的集合=new 生日集合();
foreach(生日类 temp in 小强知道的集合)
{
foreach(生日类 tp in obj)
{
if(temp.月==tp.月)
{
排除的集合.Add(tp);
}
}
}

集合操作.排除(obj,排除的集合);

C(obj);//下一结点
}

//结点C: 小强说:现在我知道了
private static void C(生日集合 obj)
{
生日集合 小强知道的集合=AI.小强分析(obj);
D(小强知道的集合); //下一结点
}

//结点D:小明说:哦,那我也知道了
private static void D(生日集合 obj)
{
生日集合 小明知道的集合=AI.小明分析(obj);
END(小明知道的集合);//下一结点
}

//完成结点:
private static void END(生日集合 obj)
{
//完成,输出到屏幕
foreach(生日类 temp in obj)
{
System.Console.WriteLine(temp.月.ToString() +"-" +temp.日.ToString());
}
}

}


//功能扶助类

class 集合操作
{
public static void 排除(生日集合 s,生日集合 v)
{
foreach(生日类 temp in v)
{
s.Remove(temp);

}

}
}


class 生日类
{
public int 日=0;
public int 月=0;
public 生日类(int y,int r)
{
日=r;
月=y;
}

}


class 生日集合:System.Collections.ArrayList
{
public void 添加(生日类 v)
{
this.Add(v);
}

public void 移除(生日类 v)
{
this.Remove(v);
}

}


class AI
{
public static 生日集合 小明分析(生日集合 v)
{
//AI,如果有维一的月份,则小明能确定
//月份为1到12

生日集合 jh=new 生日集合();

int n=0;//记数器,如果n=1表示有

for(int i=1;i <=12;i++)
{
生日类 x=null;
foreach(生日类 temp in v)
{
if(temp.月==i)
{
n=n+1;
x=temp;
}

}
if(n==1)
{
jh.Add(x);
}

n=0;

}

return jh;


}


public static 生日集合 小强分析(生日集合 v)
{
//AI,如果有维一的日,则小强能确定
//日为1到31

生日集合 jh=new 生日集合();

int n=0;//记数器,如果n=1表示有

for(int i=1;i <=31;i++)
{
生日类 x=null;
foreach(生日类 temp in v)
{
if(temp.日==i)
{
n=n+1;
x=temp;
}

}
if(n==1)
{
jh.Add(x);
}

n=0;

}

return jh;
}

}

出处:http://topic.csdn.net/u/20080226/16/7b618d28-18d5-485c-8608-6af348e54c44.html?seed=1419096167
编辑 回复 快速回复 TOP
工作流思想!
编辑 回复 快速回复 TOP
这个题以前想过,但是没有用程序实现过,收了
编辑 回复 快速回复 TOP
太强了! 牛人啊!
编辑 回复 快速回复 TOP
谢谢分享!学习一下。用代码描述感觉还比文字描述形象多了。
Qicq:454811990
Email:CodingMouse@gmail.com
Blog:http://blog.csdn.net/codingmouse
『你站在桥上看风景,看风景人在楼上看你。明月装饰了你的窗子,你装饰了别人的梦。』
编辑 回复 快速回复 TOP
小明和小强都是张老师的学生,张老师的生日是M月N日,2人都知道张老师的生日
    是下列10组中的一天,张老师把M值告诉了小明,把N值告诉了小强,张老师问他们知道他的生日是那一天吗?
    3月4日 3月5日 3月8日
    6月4日 6月7日
    9月1日 9月5日
    12月1日 12月2日 12月8日
    小明说:如果我不知道的话,小强肯定也不知道
    小强说:本来我也不知道,但是现在我知道了
    小明说:哦,那我也知道了
    请根据以上对话推断出张老师的生日是哪一天


还没用程序实现,我是这么理解的
首先是10种组合
月 3 3 3 6 6 9 9 12 12 12
日 4 5 8 4 7 1 5 1 2 8

大前提:小明和小张都一定不知道张老师的确切生日。
小明说:如果我不知道的话,小强肯定也不知道
由这句话可以判断出,月份肯定不是6和12,因为6月和12月有两个唯一的日期。而正因为有这两个唯一的日期,而小强所知道的日期又正好是7或2,那小强就有知道张老师的确切生日了。
此时,剩下的组合是
月 3 3 3 9 9
日 4 5 8 1 5
小强说:本来我也不知道,但是现在我知道了
由这句话可以判断出,小强所知道的日期应为1或4或8。因为,如果为5,小强无法判断是3月5日还是9月5日。
小明说:哦,那我也知道了
由此可以判断,肯定是9月1日,因为如果为3月,小明无法判断是3月4日还是3月8日。
编辑 回复 快速回复 TOP
还是wp30323994解释的比较好理解,这道题很有意思,我喜欢。
编辑 回复 快速回复 TOP
速办大学学历绝对真实验证真伪后付款

我们能帮您快速拿到全国各地民办学院的专、本、硕士文凭!
郑重声明:我们办理的全部都是真实有效的文凭,绝对真实长久有效。可用于求职、升职、加薪,普及,职称评定,调户口,出国、留学、移民、出国公证和职业资格报考等!英语(四、六、八)级证、
证书说明:中华人民共和国《民办教育促进法》第四章第三十三条明确规定:“民办学校的受教育者在升学、就业、社会优待以及参加先进评选等方面享有与同级同类公办学校的受教育者同等权利。”
毕业证书与全日制普通高校、自学考试等毕业证书相比有一定区别,属非国民教育毕业证书,公务员考试、司法考试等国家有特定要求须使用国民教育系列证书的考试不能使用;但在全国范围内用于个人求职应聘、单位内部考评、定岗、晋级、涨工资、各类职业资格的中、初级考试、继续教育(如:研究生课程班)及出国公证等方面,社会认可,具有同等效力。随着我国民办教育促进法的实施和深入,该证书的使用价值会越来越高,使用范围也越来越广泛。学员毕业后,证书可在本校面向全国的网站上进行电子注册,以供用人单位及毕业生查验毕业证的真伪,毕业生有完整的毕业档案、成绩单等。

现代管理大学
北京经济技术研修学院
北京明园大学
北京国际商务学院
北京兴华大学
前进大学
北京外事研修学院
北京财经贸易学院
北京青年企业管理研修学院
北京礼仪专修学院
北京长城学院
北京涉外经济专修学院
北京京华医科大学
北京商贸管理学院
北方工商管理学院
广州涉外经济学院
山东东方科技专修学院、等等还有很多学校就不列举了。

联合北京各大学快速取证!快速取证!先验证真假后付款.(不明白我意思的就别加我了)专科,本科!研究生!网上可查,电子注册,学校存档,全部真实有效,可以用任何方式验证。档案齐全:有完整齐全的档案、学籍、成绩单、入学登记表、毕业登记表、学习卡等。总之一句,绝对真的!!!!
有意者+QQ:693663772 空间有部分证书样本。或发送电子邮箱693663772@qq.com
编辑 回复 快速回复 TOP
你们都忽略了一个问题小强是知道n值得怎么可能无法区分是4日还是8日捏
编辑 回复 快速回复 TOP
顶,小强是知道n值的,怎么可能无法区分是4日还是8日
编辑 回复 快速回复 TOP
北京跃达创新java培训机构现联手化工大学合力开办专业的JAVA高端培训课程,入学即签就业协议,所有学员100%推荐就业。毕业学员平均年薪4万,最高年薪8万!
本培训部实行小班授课制,人手一机,机房全天12小时开放,每班配备两个指导老师,全天12小时陪读。
课程包括JAVA EE的企业级开发,外包软件流程规范及目前流行的3G课程培训,全部课程周期5个月,实行周一到周五全脱产上课。
现在报名优惠!
培训地点:北京朝阳区北三环东路和平街北口新化信大厦620(化工大学东门)交通便利,地铁5号线、10号线、13号线均可到达。
详情点击 http://www.udare.cn
咨询电话:64212177
QQ:974288453 544098798
编辑 回复 快速回复 TOP
在顶,小强是知道n值的,怎么可能无法区分是4日还是8日
编辑 回复 快速回复 TOP
这道题做过 但是从来没有想过用程序来实现 佩服!
编辑 回复 快速回复 TOP
听说过
编辑 回复 快速回复 TOP
值三万
编辑 回复 快速回复 TOP
一道很值钱的面试题。

我是做不出来。借用本题正好理清自己的逻辑
编辑 回复 快速回复 TOP
晕……我还是没有看懂什么意思?整个判断的思路过程我都跟不上。
编辑 回复 快速回复 TOP
根据小明说:哦,我也知道了。
可以推知小强说的“本来我不知道现在知道了”的那一天是9月1。
因为如果不是9月1,而是3月几号的话小明就不会说:“哦,我也知道了”(因为是3月的话小明没法判断是4号还是8号)。

所以说你说的忽略的那个问题是不用考虑的。
编辑 回复 快速回复 TOP
好论坛,学习了很多,支持
编辑 回复 快速回复 TOP
发新话题