Schreiben Sie eine mode-Methode in Java zu finden, das am häufigsten vorkommende element in einem array
Die Frage geht:
Schreiben Sie eine Methode namens-Modus, gibt die am häufigsten vorkommende element in einem array von ganzen zahlen. Davon ausgehen, dass das array mindestens ein element und jedes element in dem array hat einen Wert zwischen 0 und 100 inclusive. Bindungen brechen, indem Sie den niedrigeren Wert.
Zum Beispiel, wenn das array übergeben, der die Werte enthält,{27, 15, 15, 11, 27}, deine Methode zurückgeben soll, 15. (Hinweis: möglicherweise möchten Sie Blick auf die Tally-Programm von weiter oben in diesem Kapitel, um eine Vorstellung davon wie dieses problem zu lösen.)
Unten ist mein code, der fast funktioniert, außer für single-element-arrays
public static int mode(int[] n)
{
Arrays.sort(n);
int count2 = 0;
int count1 = 0;
int pupular1 =0;
int popular2 =0;
for (int i = 0; i < n.length; i++)
{
pupular1 = n[i];
count1 = 0; //see edit
for (int j = i + 1; j < n.length; j++)
{
if (pupular1 == n[j]) count1++;
}
if (count1 > count2)
{
popular2 = pupular1;
count2 = count1;
}
else if(count1 == count2)
{
popular2 = Math.min(popular2, pupular1);
}
}
return popular2;
}
Bearbeiten: endlich kapiert. Geändert count1 = 0;
zu count1 = 1;
alles funktioniert jetzt!
- +1 für gute Arbeit, bevor die Frage (fast funktioniert, außer für single-element-arrays). Könnte Sie posten Sie Ihre Lösung als Antwort und markieren Sie die richtige Antwort? So können auch andere Leute nicht kommen, um Ihre Frage zu helfen, dachte, es wurde noch nicht beantwortet. Danke.
- Ich schließe mich @Simon ' s Kommentar, und fügen Sie es, dass die momentan akzeptierte Antwort (Gubatron s) ist fehlerhaft und falsch. Es wird beispielsweise ein Fehler in der Beispiel-input -
{27, 15, 15, 11, 27}
. Die Länge dercounts
wird 5, und die Liniecounts[n[I]]++
fehl, da es versucht, Inkrement, das element mit dem index 27, die ist out-of-bounds als shridhad Hinweise in einem Kommentar. - Ich Stimme mit Simon, würden Sie verschieben die Lösung in der Bearbeitung bis eine Antwort unten? Wir nutzen gerne die Q&A-format hier.
- Im Rückblick auf diese Frage fast 5 Jahre später, war ich erstaunt, wie weit ich gegangen aus dann. Es war der Anfang von mir switching Karriere, computer-Wissenschaft, und ich hatte keine Kenntnis von Datenstrukturen wie
map
undset
usw. Die fast brute-force-Ansatz gemacht, mich erforschen, effiziente algorithmen während meines Studiums und der Arbeit. es hat mein Leben verändert 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie eine hashmap für solche Probleme. es dauert O(n) Zeit, um geben Sie jedes element in der hashmap o(1), um das element abzurufen. In dem gegebenen code, ich bin grundsätzlich ein globales max und vergleicht Sie mit den empfangenen Wert auf 'get' aus der hashmap, jedes mal gehe ich in ein element hinein, haben einen Blick:
hashmap besteht aus zwei teilen, einer ist der Schlüssel, der zweite ist der Wert, wenn Sie eine get-operation auf den Schlüssel, dessen Wert zurückgegeben wird.
Sollten Sie in der Lage, dies zu tun in N Operationen, d.h. in nur einem Durchgang, O(n) Zeit.
Verwenden Sie eine Karte oder int[] (wenn das problem nur bei int) erhöht den Zähler, und auch eine variable verwenden, der hält die Taste, die die max-count gesehen. Jedes mal wenn Sie erhöhen einen Zähler, Fragen, was der Wert ist und Vergleiche es mit dem Schlüssel, den Sie zuletzt verwendet, wenn der Wert größer ist, aktualisieren Sie die-Taste.
int[] n= new int[] {12, 13, 13};
es wird durchArrayIndexOutOfBoundsException
. Also diese Lösung funktioniert nur, wenn jede Zahl im array kleiner ist als die Länge des Arrays.{27, 15, 15, 11, 27}
.check this..
Kurz:Nimm jedes element von array und vergleichen Sie es mit allen Elementen des Arrays, das Wetter ist es gleich der gehänselt oder nicht.
Ich würde diesen code verwenden. Es beinhaltet eine
instancesOf
Funktion, und es läuft durch jede Zahl.Bemerkte ich, dass der code Gubatron gepostet funktioniert nicht auf meinem computer; es gab mir einen
ArrayIndexOutOfBoundsException
.Hier ist meine Antwort.
arr
beinhaltet negative Werte. Es kann auch Probleme geben, wenn das array enthält sehr große Werte wie 2,147,483,647.Ich weiß, dass diese Frage von vor einer Weile, aber ich wollte eine Antwort, die ich glaube, wird auf die ursprüngliche Frage. Der Nachtrag zu dieser Frage zu schreiben, das die Modus-Methode, ohne sich auf einen voreingestellten Bereich (in diesem Fall 0 bis 100). Ich habe geschrieben eine version für den Modus verwendet der Bereich der Werte in das ursprüngliche array zu erzeugen, das count-array.
Ich habe vor kurzem ein Programm berechnet, dass ein paar verschiedene Statistiken, einschließlich der mode. Während der Codierung werden kann rudimentär, es funktioniert für alle Arrays mit int-Werten, und könnte so geändert werden, verdoppelt, Schwimmern, etc. Die änderung der array-basiert auf löschen von Indizes in dem array, das sind nicht die final-Modus-Wert(en). Dies ermöglicht Ihnen zu zeigen, alle Modi (wenn es mehrere) sowie die Menge der vorkommen (letztes Element im Modi-array). Im folgenden code wird die Methode getMode sowie die deleteValueIndex Methode benötigt, um diesen code auszuführen
Basiert auf der Antwort von @codemania23 und die Java-Docs für HashMap ich schrieb diesen code snipped und tests eine Methode, die gibt die meisten occurrent Zahl in ein array von zahlen.
Unit-Tests
Dies ist nicht die Schnellste Methode um den block, aber ist ziemlich einfach zu verstehen, wenn Sie nicht wollen, beteiligen Sie sich in HashMaps und wollen auch zu vermeiden, mit 2 for-Schleifen für die Komplexität der Probleme....
Hier habe ich programmiert " single-loop. Wir sind immer mode von a[j-1], weil localCount wurde vor kurzem aktualisiert, wenn j j-1. Auch N ist die Größe des Arrays & Zähler werden initialisiert auf 0.
import java.util.HashMap;
public class SmallestHighestRepeatedNumber {
static int arr[] = { 9, 4, 5, 9, 2, 9, 1, 2, 8, 1, 1, 7, 7 };
}
DIESER CODE BERECHNET DEN MODUS, DEN MEDIAN UND DEN MITTELWERT. ES IST GETESTET UND ES FUNKTIONIERT. Es ist ein komplettes Programm von Anfang bis Ende und stellen.
1000000
?