有趣的JAVA面试题,据说月薪3W的面试题

小明和小强都是张老师的学生,张老师的生日是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;
                }

        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值