Spotify拼图Best Before

时间:2012-04-03 10:15:16

标签: java puzzle spotify

我是Java的新手并且昨天尝试了Best Before puzzle from Spotify。我发送时收到“错误答案”错误。 检查其他解决方案没有帮助,我无法弄清楚哪个输入给出了错误的答案。 你最好告诉我哪些代码导致了错误的答案。我应该能够自己更正代码。

import java.util.Scanner;

public class Bestbefore {

public static void main(String[] args) {
     //Process Input String
    Scanner scanner = new Scanner(System.in);
    String dateString = scanner.nextLine();
    Integer a,b,c;
    a=Integer.parseInt(dateString.substring(0,dateString.indexOf("/")));
    b=Integer.parseInt(dateString.substring(dateString.indexOf("/")+1,
                        dateString.lastIndexOf("/")));
    c=Integer.parseInt(dateString.substring(dateString.lastIndexOf("/")+1));
    int[][] va={            //All possible combinations
            {a,b,c},
            {a,c,b},
            {b,a,c},
            {b,c,a},
            {c,a,b},
            {c,b,a}
    };
    int i=0;
    while (!checkDate(va[i][0], va[i][1], va[i][2]) 
            && i<5) // get the first valid date combination
        i++;
    //to prevent OutofBoundsException of the while loop
    if (!checkDate(va[i][0], va[i][1], va[i][2]))           
            i++;

    if (i==6)            
        System.out.println(dateString+" is illegal");
    else
    {   //compare the rest of the va-Array and save the position of the lowest Date in i
        for (int k=i+1;k<6;k++)                                                     
            if (checkDate(va[k][0], va[k][1], va[k][2]))
            {
                if (ageOfDate(va[k][0], va[k][1], va[k][2]) 
                        < ageOfDate(va[i][0], va[i][1], va[i][2]))
                    i=k;
            }
            System.out.println(getDate(va[i][0], va[i][1], va[i][2]));
    }
}
public static boolean checkDate(int day,int month, int year)
{
    int[] dpm={31,28,31,30,31,31,30,31,30,31,30,31};    //Days per Month
    if (year<2000)
        year=year+2000;
    if((year%4==0 && year%100!=0) || year%400==0)
        dpm[1]=29;                                      //Leapyear correction
    if (month==0 || month>12)
        return false;
    else
        if (day==0 || day>dpm[month-1])
            return false;
    else
        return true;
}
public static int ageOfDate(int day,int month, int year)    //to compare 2 dates
{
    return ((year*10000)+(month*100)+day);
}
public static String getDate(int day,int month, int year) //for the Output
{
    String smonth = String.valueOf(month);
    String sday = String.valueOf(day);
    if (year<2000)
        year=year+2000;
    if (month<10)
        smonth="0"+smonth;
    if (day<10)
        sday="0"+sday;
    return (year+"-"+smonth+"-"+sday);
  }
}

2 个答案:

答案 0 :(得分:2)

6月有30天,8月和7月都有31个。你的数组dpm以错误的方式初始化。所以这里是你可能出错的地方:31/06/20 - &gt;最早可能是2031年6月20日,而不是2020年6月31日。

希望这能解决你的问题。

答案 1 :(得分:0)

可能是你没有处理负数。 -3/5/2012将是有效的。此外,您的程序不会优雅地处理无效的整数,因为它将以异常退出。如果我通过“as / 5/12”输出应该是“as / 5/12非法”。

仅供参考,以下

while (!checkDate(va[i][0], va[i][1], va[i][2]) 
        && i<5) // get the first valid date combination
    i++;
//to prevent OutofBoundsException of the while loop
if (!checkDate(va[i][0], va[i][1], va[i][2]))           
        i++; 

可以缩减为

 while (i <= 5 && !checkDate(va[i][0], va[i][1], va[i][2]))
    i++;