Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo zusammen,
ich muss eine Aufgabe lösen,aber mir fallen irgendwie keine Ideen mehr ein, wie ich mit der Aufgabe weiter arbeiten soll.
Also zur Aufgabe :
Ich soll ein Programm schreiben, welches mir sagen soll, ob zwei Zahlen, in einer Menge von Zahlen, den gleichen Wert haben. Wenn ja, dann soll das Programm true wiedergeben und wenn nicht, dann false.
Schonmal danke im voraus.
Zu meinem Programm:
Java:
public class mehrfach1 {
static boolean mehrfach(int[] a) {
int n = a.length;
int i = 0;
int merker = 0;
boolean h = false;
while (i < n || a[merker] < n) {
if (merker != i && a[merker] / a[i] == 1 ) {
h = true;
System.out.println("true");
return h;
} else {
h = false;
System.out.println("false");
i++;
}
if (i == n) {
merker = merker + 1;
i = 0;
}
}
return h;
}
public static void main(String[] args) {
int[] p = {3, 7, 8, 15};
boolean k;
k = mehrfach(p);
System.out.println(k);
}
}
Ich denke das Problem liegt an dieser Stelle:
Java:
if (merker != i && a[merker] / a[i] == 1 ) {
aber egal was ich mache, ich komme irgendwie nicht weiter.
Das soll einfach nur heißen, dass a[merker] geteilt durch a = 1 ist.
Mir fällt da gerade nichts auf^^ aber ich bin ja auch ein richtiger Anfänger. Sry
Ich versuche das mal mit einem Beispiel zu verdeutlichen:
Wenn ich ein Array mit der Zahlenfolge von {5,8,12,5,16,24} habe, soll das Programm herausfinden ob in dem Array zwei Zahlen sind, die genau den gleichen Wert haben. Also in dem Beispiel wäre 5 die Zahl, weil diese Zahl ja zweimal in dem Array vorhanden ist.
was ist denn deiner Ansicht nach der Unterschied zwischen (a[merker] geteilt durch a = 1) und (a[merker] == a)?
bzw. musst du auch nicht sagen, war ja nicht deine Idee,
andere Frage: was ist deine Intention es so zu programmieren, welchen Plan verfolgst du? welche Funktion hat diese Code-Zeile?
Bei EikeB's Lösung hast du aber eine sehr schlechte Laufzeit ([c]O(n^2)[/c]). Wenn du die Daten zuerst mit einem guten Sortieralgorythmus sortierst (z.B. Quicksort), hast du eine deutlich bessere Laufzeit:
Java:
public static boolean mehrfach(int... p) {
int[] data = p.clone();
Arrays.sort(data);
for (int i = 1; i < data.length; i++) {
if (data[i - 1] == data[i]) {
return true;
}
}
return false;
}
Das [c]copy()[/c] natürlich nur, damit die ursprünglichen Daten nicht modifiziert werden.
Wie sollte denn dann meine Version mit deinem Vorschlag aussehen ?
Wenn ich das so schreibe:
Java:
static boolean mehrfach(int[] a) {
int n = a.length;
int i = 0;
int merker = 0;
boolean h = false;
while (i < n || a[merker] < n) {
if (a[i] == a[merker] && merker != i ) {
h = true;
System.out.println("true");
return h;
} else {
h = false;
System.out.println("false");
i++;
}
if (i == n) {
merker = merker + 1;
i = 0;
}
}
return h;
Glaub mir, mit einer Schleife wirst du nicht glücklich. Ohne Sortieren ist EikeB's Code am besten, das ist der typische "jeder-mit-jedem-Vergleich". Ich denke es ist viel sinnvoller, die funktionierenden, einfachen Varianten zu verstehen, als eine verkorkste zum Laufen zu bringen.
OT: Natürlich gibt es auch "Profi-Varianten" wie:
Java:
static boolean mehrfach(int[] a) {
Set<Integer> set = new HashSet<Integer>();
for(int i = 0; i < a.length; i++) {
if(! set.add(a[i])) {
return true;
}
}
return false;
}
... aber sowas ist für das Verständnis sicher nicht hilfreich.