2012-04-03 10 views
0

Ich bin ziemlich neu in Java und versuchte gestern die Best Before puzzle from Spotify. Ich bekomme den Fehler "Falsche Antwort", wenn ich es einschicke. Die Suche nach anderen Lösungen hat nicht geholfen und ich kann nicht herausfinden, welche Eingabe eine falsche Antwort gibt. Im besten Fall würden Sie mir einfach sagen, welcher Code zur falschen Antwort führt. Ich sollte den Code dann selbst korrigieren können.Spotify Puzzle Best Before

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

Antwort

2

Juni muss reduziert werden, sowohl August und 31. Juli Ihr Array dpm haben in einer falschen Weise initialisiert wird. Also hier ist, wo Sie falsch gehen können: 31/06/20 -> frühest möglich ist 20. Juni 2031 statt 31-st Juni 2020.

Ich hoffe, dies löst Ihr Problem.

+0

Guter Fang. ....... –

+0

Ich bin so dumm ... vielen Dank izo – geM

0

Könnte sein, dass Sie nicht mit negativen Zahlen umgehen. -3/5/2012 wäre gültig. Außerdem behandelt Ihr Programm keine ungültigen Ganzzahlen, da es mit einer Ausnahme beendet wird. Wenn ich den "as/5/12" -Ausgang übergebe, sollte "as/5/12 is illegal" sein.

FYI, könnte folgende

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

30 Tage

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

danke krank versuchen Sie die negativen Zahlen als nächstes. Aber wenn ich die if-Prüfung lösche ich weiß nicht, ob die letzte Variation gültig ist oder nicht. – geM

+0

Sie können immer noch die 'if (i == 6)' –

+0

ok negative Zahlen sind behoben, aber das war nicht alles anscheinend, wie ich immer noch falsche Antwort bekomme. while (i <= 5 &&! checkDate (va [i] [0], va [i] [1], va [i] [2])) i ++; gibt eine OutOfBounds Exception ist ich werde mit i = 6 überprüfen und das Array geht nur von 0-5 – geM