大家都知道张老师生日问题 这道面试题吧? 我再发一下小明和小强都是张老师的学生,张老师的生日是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日 
    小明说:如果我不知道的话,小强肯定也不知道 
    小强说:本来我也不知道,但是现在我知道了 
    小明说:哦,那我也知道了 
    请根据以上对话推断出张老师的生日是哪一天我想求这个题的java code!有人知道该怎么写吗???

解决方案 »

  1.   

    public class Test{

    public static void main(String[] args) {
    System.out.println(getDate());
    }

    static String getDate(){
    String[] dates = new String[]{"3-4","3-5","3-8","6-4","6-7","9-1","9-5","12-1","12-2","12-8"};
    //排除从日期可以确定月份的生日
    String[] datesTemp = dates.clone();
    int count = 0;
    for(int i = 0;i < datesTemp.length;i++){
    count = 0;
    String day = datesTemp[i].split("-")[1];
    for(int j = 0;j < dates.length;j++){
    if(datesTemp[j].split("-")[1].equals(day)){
    count++;
    }
    }
    if(count == 1){
    String mouth = datesTemp[i].split("-")[0];
    for(int j = 0;j < dates.length;j++){
    if(datesTemp[j].split("-")[0].equals(mouth)){
    dates[j] = "";
    }
    }
    }
    }
    //获取重复的日子
    String day = "";
    for(int i = 0;i < dates.length;i++){
    count = 0;
    for(int j = i + 1;j < dates.length;j++){
    if(!dates[j].equals("") && dates[i].split("-")[1].equals(dates[j].split("-")[1])){
    count++;
    }
    }
    if(count != 0){
    day = dates[i].split("-")[1];
    break;
    }
    }
    //确定只有2个生日的月份
    String mouth = "";
    for(int i = 0;i < dates.length;i++){
    count = 0;
    for(int j = 0;j < dates.length;j++){
    mouth =  dates[i].split("-")[0];
    if(!dates[j].equals("") && mouth.equals(dates[j].split("-")[0])){
    count++;
    }
    }
    if(count != 2){
    for(int j = 0;j < dates.length;j++){
    if(mouth.equals(dates[j].split("-")[0])){
    dates[j] = "";
    }
    }
    }
    }

    //由于小强知道了,那么就不是重复的日子
    for(int i = 0;i < dates.length;i++){
    if(!dates[i].equals("") && day.equals(dates[i].split("-")[1])){
    dates[i] = "";
    }
    } for(int i = 0;i < dates.length;i++){
    if(!dates[i].equals(""))
    return dates[i];
    }
    return null;
    }
    }
      

  2.   

    小明说:如果我不知道的话,小强肯定也不知道 
    说明小明知道的月数,里面的日数是有重复的,所以排除6月和12月,因为7日和2日是没重复的,如果是6月或12月不能肯定是小强不知道 小强说:本来我也不知道,但是现在我知道了 
    说明小强知道的日数在剩下的月数里是唯一的,剩下的月数是3月和9月,日数唯一的有3月4日,3月8日和9月1日,所以日数是4,8,1的某一个小明说:哦,那我也知道了
    说明小明知道的月数里,该月中日数唯一的不能多于2个,否则小明没法判断,所以只有9月1日了代码例子
    String[] date = {
        "3月4日", "3月5日", "3月8日",
        "6月4日", "6月7日",
        "9月1日", "9月5日",
        "12月1日","12月2日","12月8日"
    };
    List<String[]> list = new LinkedList<String[]>();
    for (String s : date) {
        list.add(s.split("\\D+")); //把月日分割出来保存到数组
    }
    Set<String> del = new HashSet<String>();for (int i=0; i<list.size(); i++) { //第一句话
        boolean exist = false;
        for (int j=0; j<list.size(); j++) {
            if (i!=j && list.get(j)[1].equals(list.get(i)[1])) { //查找唯一的日数
                exist = true;
                break;
            }
        }
        if (! exist) {//如果是唯一的日数
            del.add(list.get(i)[0]); //则该月要删除
        }
    }
    for (String s : del) {
        for (int i=list.size()-1; i>=0; i--) {
            if (list.get(i)[0].equals(s)) list.remove(i);
        }
    }del.clear();
    for (int i=0; i<list.size(); i++) { //第二句话
        boolean exist = false;
        for (int j=0; j<list.size(); j++) {
            if (i!=j && list.get(j)[1].equals(list.get(i)[1])) { //查找唯一的日数
                exist = true;
                break;
            }
        }
        if (exist) { //如果日数不是唯一的
            del.add(list.get(i)[1]); //则该日要删除
        }
    }
    for (String s : del) {
        for (int i=list.size()-1; i>=0; i--) {
            if (list.get(i)[1].equals(s)) list.remove(i);
        }
    }del.clear();
    for (int i=0; i<list.size(); i++) { //第三句话
        boolean exist = false;
        for (int j=0; j<list.size(); j++) {
            if (i!=j && list.get(j)[0].equals(list.get(i)[0])) { //查找唯一月数
                exist = true;
                break;
            }
        }
        if (exist) { //如果不是唯一月
            del.add(list.get(i)[0]); //则该月要删除
        }
    }
    for (String s : del) {
        for (int i=list.size()-1; i>=0; i--) {
            if (list.get(i)[0].equals(s)) list.remove(i);
        }
    }if (list.size() > 0) {
        for (String[] s : list) System.out.printf("%s月%s日\n", s[0], s[1]);
    }