Spotify пазл Лучший до - PullRequest
       12

Spotify пазл Лучший до

0 голосов
/ 03 апреля 2012

Я довольно новичок в Java и вчера попробовал головоломку Best Before от 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 ]

2 голосов
/ 03 апреля 2012

В июне 30 дней, в августе и июле 31. Ваш массив dpm инициализирован неправильно.Так что вот где вы можете пойти не так: 31/06/20 -> самое раннее из возможных - 20 июня 2031 года вместо 31 июня 2020 года.

Надеюсь, что это решит вашу проблему.

0 голосов
/ 03 апреля 2012

Возможно, вы не обрабатываете отрицательные числа.-3/5/2012 будет действительным.Кроме того, ваша программа не обрабатывает некорректные целые числа изящно, поскольку она завершится с исключением.Если я передаю «as / 5/12», вывод должен быть «as / 5/12 недопустим».

FYI, следующее

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++;
...