2012-04-01 14 views
0

Ich arbeite an einem Programm, das die größte Zahl in beiden Arrays zurückgibt. Hier finden Sie einige Erwartungen:Java - gebe das größte Element in beiden Arrays zurück

maxInCommon({1, 2, 3, 4, 5, 6, 7, 8}, {-1, -2, 9, 5}) → 5 
maxInCommon({1}, {}) → 0 
maxInCommon({-1, -2}, {-2, -3, -4}) → -2 

Mein Code funktioniert für viele Situationen, aber nicht für diese:

asn9_maxInCommon({-10, -11}, {-10, -11, -12}) → -10 

statt Nachgeben „-10“, mein Programm gibt einen „-11“. Im Folgenden ist mein AKTUALISIERT Code:

public int maxInCommon(int[] nums1, int[] nums2) { 
    int numInCommon = 0; 

    Arrays.sort(nums1); 
    Arrays.sort(nums2); 

    ArrayList<Integer> nums1List = new ArrayList(); 
    ArrayList<Integer> nums2List = new ArrayList(); 

    int number = 0; 
    int number1 = 0; 

    for (int a = 0; a < nums1.length; a++) 
    { 
    number = nums1[a]; 
    nums1List.add(number); 
    } 

    for (int b = 0; b < nums2.length; b++) 
    { 
    number1 = nums2[b]; 
    nums2List.add(number1); 
    } 

    for (int c = (nums1List.size() - 1); c > - 1; c--) 
    { 
    for (int d = (nums2List.size() - 1); d > -1; d--) 
     { 
      if (nums1List.get(c) == nums2List.get(d)) 
       numInCommon = nums1List.get(c); 
     } 
    } 
    return numInCommon; 
} 

Ich dachte, die Logik des Codes sollte in Ordnung sein, aber es funktioniert immer noch nicht. Einige andere Fälle, bei denen die Logik fehlschlägt, sind:

Mein Code ergibt stattdessen "0".

maxInCommon({1, 2, 3, 4, 5, 6, 7, 8}, {-1, -2, 9, 6, 7, 8, 9}) → 8 

Mein Code ergibt stattdessen "6".
Der Zweck der ArrayLists ist es, ein Element nach jedem Vergleich irgendwie zu entfernen. Ich habe dieses Feature hier nicht benutzt.

+0

Sie sollten 'numInCommon' nur ändern, wenn der Ist-Common-Wert größer ist als der letzte gemeinsame Wert gefunden Genau –

+0

. Fügen Sie einfach eine Überprüfung hinzu, um zu sehen, ob max1 == nums2 [b] AND that max1> numInCommon. – cjm

+0

Vielen Dank, ich werde jeden Ihrer Vorschläge einzeln untersuchen. –

Antwort

0

Wenn Ihr Code tatsächlich funktioniert, können Sie diesen Teil ändern könnte:

if (max1 == nums2[b]) 
    numInCommon = max1; 

zu

if (max1 == nums2[b] && numInCommon < max1) { 
    numInCommon = max1; 
} 

, die es

0

Das Problem tun sollten, ist, dass Sie max1 = nums1[a]; im äußeren for haben Schleife und dann einfach max1 zu numInCommon zuweisen, wenn max1 im Secon enthalten ist d-Reihe. max1 wird immer das letzte Element im ersten Array sein, die if Anweisung direkt danach ist sinnlos.

Daher ist der Grund, warum Sie -11 als die größte gemeinsame Nummer erhalten, weil -11 das letzte Element im ersten Array ist, das auch in der zweiten ist - das ist, was Ihre Funktion berechnet.

Sie sollten stattdessen vergleichen, wenn max1 größer als die größte gemeinsame Nummer ist, und entfernen Sie die unnötige if Anweisung aus der äußeren for Schleife. Ein besserer Name für max1 ist temp, und es ist eine unnötige Variable, wenn Sie nur auf nums1[a] von der inneren for Schleife zugreifen können.

EDIT: Das Hausaufgaben-Tag nicht sehen, versuchen Sie, die Änderungen am Code selbst vorzunehmen, indem Sie die obigen Informationen verwenden.

Sie sollten wahrscheinlich auch eine Möglichkeit haben, anzugeben, ob zwischen den beiden Arrays keine Nummern vorhanden sind.

+0

Hallo, ich habe Ihren Code getestet, und dies ist der Testfall: [link] (http://farm8.staticflickr.com/7244/7034145105_1583017045_z.jpg). –

+0

Ich frage mich, ob ich die größte Zahl im ersten Array finden könnte, vergleichen Sie es, dann setzen Sie es auf 0, und wiederholen Sie den gleichen Prozess, dabei finden Sie die zweitgrößte Anzahl zum Vergleich und so weiter. –

+0

@ VũChâu: Das liegt daran, dass 'numInCommon' auf 0 und 0> 2 initialisiert wird. Sie sollten' numInCommon' auf den minimalen int-Wert initialisieren oder besser noch 'boolean' verwenden, um anzuzeigen, ob noch irgendwelche gemeinsamen Nummern gefunden wurden. Ich habe den Fehler im Code nicht behoben, weil ich gerade festgestellt habe, dass diese Frage als Hausaufgabe markiert wurde. – AusCBloke

-1

Jetzt funktioniert es gut.

package test; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class test { 

    public static void main(String[] args) { 


     int a[] = {-1,-2}; 
     int b[] = {-2,-3,-4}; 

     try{ 
      System.out.println(getMaxCommon(a,b)); 
     }catch(Exception e){ 
      System.out.println("Not found common no"); 
     } 
    } 

    public static int getMaxCommon(int[] arr1,int[] arr2) { 

     int arr1Temp[] = arr1.clone(); 
     int arr2Temp[] = arr2.clone(); 

     Arrays.sort(arr1Temp); 
     Arrays.sort(arr2Temp); 

     List<Integer> list1 = new ArrayList<Integer>(); 
     List<Integer> list2 = new ArrayList<Integer>(); 

     for(int i=0;i<arr1Temp.length;i++){ 
      list1.add(arr1Temp[i]); 
     } 

     for(int i=0;i<arr2Temp.length;i++){ 
      list2.add(arr2Temp[i]); 
     } 


     if(arr1Temp.length < arr2Temp.length){ 
      for(int i=arr1Temp.length-1;i>=0;i--){ 
       if(list2.contains(arr1Temp[i])){ 
        return arr1Temp[i]; 
       } 
      } 
     }else{ 
      for(int i=arr2Temp.length-1;i>=0;i--){ 
       System.out.println(); 
       if(list1.contains(arr2Temp[i])){ 
        return arr2Temp[i]; 
       } 
      } 
     } 

     return (Integer) null; 
    } 
} 
+0

Er möchte das Maximum der Schnittmenge zweier Arrays, nicht das Maximum eines Arrays. – AusCBloke

+1

Also, wenn ich '{4, 1}' und '{3, 2, 1}', mit Rückgabewerten von 4 und 3 hätte, wie würde ich herausfinden, dass die größte gemeinsame Zahl 1 war? – AusCBloke

1

folgende Arbeiten:

import java.util.Arrays; 

public class Main { 

    public static void main(String[] args) { 
     int[] array1 = new int[]{1, 2, 3, 4, 5, 6, 7, 8}; 
     int[] array2 = new int[]{-1, -2, 9, 5}; 
     System.out.println(getCommonMax(array1, array2)); 
    } 

    static int getCommonMax(int[] array1, int[] array2) { 
     int commonMax = 0; 
     Arrays.sort(array1); 
     for(int i = array1.length -1; i > -1; i--) { 
      if(contains(array2, array1[i])) { 
       commonMax = array1[i]; 
       break; 
      } 
     } 
     return commonMax; 
    } 

    static boolean contains(int[] array, int i) { 
     boolean contains = false; 
     for(int i2 : array) { 
      if(i2 == i) { 
       contains = true; 
       break; 
      } 
     } 
     return contains; 
    } 

} 
+0

Um Ihren Code zu verbessern, können Sie das Array von rechts nach links durchqueren, so dass das erste gefundene Element das Maximum ist (das Array ist von min bis max sortiert) –

+0

aber ich durchquere das Array von rechts nach links; Ich habe es nicht in absteigender Reihenfolge sortiert, denn aufsteigend ist der Standardwert und das macht es einfacher für das OP – Tom

+0

yeah Ich habe den Code nicht gut gelesen, sorry :) –

Verwandte Themen