首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 月薪三万的一道面试题 [已结贴,结贴人:c4lijie]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-26 16:24:27 楼主
    小明和小强都是张老师的学生,张老师的生日是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日
        小明说:如果我不知道的话,小强肯定也不知道
        小强说:本来我也不知道,但是现在我知道了
        小明说:哦,那我也知道了
        请根据以上对话推断出张老师的生日是哪一天

    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-26 16:37:041楼 得分:0
    答案应该是9月1日。

    google一把就可以赚3万月薪?google的魅力啊!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yami251139
    • 等级:
    发表于:2008-02-26 16:39:082楼 得分:0
    我猜是6月7號。。。。
    真的有3W嗎?
    別是3W泰銖歐。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-26 16:41:503楼 得分:20
    答案应该是9月1日。
    1)首先分析这10组日期,经观察不难发现,只有6月7日和12月2日这两组日期的
    日数是唯一的。由此可知,如果小强得知的N是7或者2,那么他必定知道了老师的
    生日。
    2)再分析“小明说:如果我不知道的话,小强肯定也不知道”,而该10组日期的
    月数分别为3,6,9,12,而且都相应月的日期都有两组以上,所以小明得知M后
    是不可能知道老师生日的。
    3)进一步分析“小明说:如果我不知道的话,小强肯定也不知道”,结合第2步
    结论,可知小强得知N后也绝不可能知道。
    4)结合第3和第1步,可以推断:所有6月和12月的日期都不是老师的生日,因为
    如果小明得知的M是6,而若小强的N==7,则小强就知道了老师的生日。(由第
    1步已经推出),同理,如果小明的M==12,若小强的N==2,则小强同样可以知道老师的生日。即:M不等于6和9。现在只剩下“3月4日 3月5日 3月8日 9月1日
    9月5日”五组日期。而小强知道了,所以N不等于5(有3月5日和9月5日),此时,
    小强的N∈(1,4,8)注:此时N虽然有三种可能,但对于小强只要知道其中的
    一种,就得出结论。所以有“小强说:本来我也不知道,但是现在我知道了”,
    对于我们则还需要继续推理
    至此,剩下的可能是“3月4日 3月8日 9月1日”
    5)分析“小明说:哦,那我也知道了”,说明M==9,N==1,(N==5已经被排除,3月份的有两组)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-26 16:43:344楼 得分:0
    代码大概是: 

    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;
            }

        }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-26 16:47:575楼 得分:0
    6月4日  ^^
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-26 16:48:336楼 得分:0
    解题思路:

          由小明第一句话可知,此月可能为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日
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-26 17:06:037楼 得分:0
    这是公务员考试的题目,我做到过。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-26 17:15:518楼 得分:0
    9月1日
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bao110908
    • 等级:
    发表于:2008-02-26 17:30:559楼 得分:0
    我记得这题原来只有1万,现在涨成3万了啊?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-26 17:36:0210楼 得分:0
    4楼.....

    大师级代码..哈哈!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yami251139
    • 等级:
    发表于:2008-02-26 17:39:0311楼 得分:0
    bao110908
    火龙果
    等 级:
    发表于:2008-02-26 17:30:559楼 得分:0
    我记得这题原来只有1万,现在涨成3万了啊?
    ======================================
    連方便面都長了3毛,跟何況這道題目?
    現在只有工資是部長的啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-26 18:55:0112楼 得分:0
    火星贴啊!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-26 19:09:3113楼 得分:0
    曾几何时也染指过

    现在看看貌似小明说的头半句话 烟雾弹得不行
    如果我不知道的话” 光知道月份的小明是肯定不知道 还存在如果吗
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-27 13:24:3114楼 得分:0
    完全搞不懂
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-27 13:50:2615楼 得分:0
    迷茫,这种题是跟JAVA相关的吗?还有方便面涨的太快了!~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-27 13:58:4616楼 得分:0
    3万月薪我要  9月1号
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ohuan
    • 等级:
    发表于:2008-02-27 14:00:1517楼 得分:0
    13楼
    曾几何时也染指过     

    现在看看貌似小明说的头半句话  烟雾弹得不行
    “如果我不知道的话”  光知道月份的小明是肯定不知道  还存在如果吗
    ===================================================================
    是啊,我就是这个“如果”搞不明白,明明是不知道嘛,还如果什么~~~我倒~~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-27 14:00:5718楼 得分:0
    一个月三万,好像没这么容易赚吧。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-27 14:11:2819楼 得分:0
    三楼和四楼已经给出正解了,结贴了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-27 14:36:1720楼 得分:0
    oo
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-27 15:01:1421楼 得分:0
    来晚了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ttlyfast
    • 等级:
    发表于:2008-02-27 15:12:1922楼 得分:0
    哈哈
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-27 15:17:1823楼 得分:0
    uu
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-27 15:38:5924楼 得分:0
    答案是6月4日,
    因为如果告诉小强的是7或2的话那小强就直接知道了答案,由此排除7和2又由小明说的话后小强就知道了可见老师告诉小强的数字能让小强确定
    两个中的一个而这两个中又包括7或者2只有6月中包括4和7由此可知答案为6月4日
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-27 15:53:0825楼 得分:0
    我以前也面试过,不过不知道怎么做,以上各位都超强啊。学习学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-27 16:13:0826楼 得分:0
     9月1日
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-27 17:34:5027楼 得分:0
    3月4日 3月8日 何尝不可?

    看看题中的组合
            3月4日  3月5日  3月8日 
        6月4日  6月7日 
        9月1日  9月5日 
        12月1日  12月2日  12月8日 

    既然小强通过小明的话排除了6月和12月 那么除了3月和9月重复的5日不能确定外,这两个月内4日、8日、1日都是唯一的了,也就是说小强可以确定3月4日、3月8日、9月1日中的任何一日,题目中的最后“小明说:哦,那我也知道了”没有道理,此题有问题,出题的师傅没有考虑周全。。。 。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-27 17:56:0328楼 得分:0
    正确答案是:都说是9.1
    测试Java代码!!
    Java code
    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; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-27 19:32:2829楼 得分:0
    是c++primer4书上的一道题..怎么成这个了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-27 20:00:2230楼 得分:0
    2人都知道张老师的生日

    这半句话误导我了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-27 20:20:0731楼 得分:0
    强人!!!!!!
    修改 删除