J'ai besoin de devoirs pour obtenir le numéro le plus "populaire" dans un tableau (numéro de la fréquence la plus élevée), et s'il existe plusieurs numéros avec le même nombre de spectacles, obtenez un certain nombre au hasard.
Après plus de plus de trois heures d'essai et de rechercher sur le Web, c'est ce que j'ai obtenu: Ce code fonctionne, mais ne prenez pas en compte un cas important - s'il y a plus de cas qu'un nombre avec le même nombre de spectacles. Ensuite, il suffit de recevoir le premier.
Par exemple: int [] A = {1, 2, 3, 4, 4, 5, 4, 5, 5}; code> Le code prendra 4 car il montra d'abord, et ce n'est pas aléatoire comme cela devrait être.
Une autre chose - puisqu'il s'agit de devoirs, je ne peux pas utiliser des arraylistes / cartes et des trucs que nous n'avons toujours pas appris.
Toute aide serait appréciée. P> p>
3 Réponses :
Étant donné qu'ils ne vous ont pas donné une limite de complexité de temps, vous pouvez "brute force" le problème en balayant le tableau N ^ 2 fois. (Disclaimer, c'est la manière la plus intuitive de le faire, pas le plus rapide ou le plus efficace en matière de mémoire et de processeur). P>
Voici quelques pseudo-code: P>
i code> dans le tableau d'origine, itérer le tableau d'origine et incrémenter l'élément dans la matrice d'occurrence à i code> chaque fois que la numérisation trouve les doublons de la valeur de la valeur stocké dans i code> dans le tableau d'origine. LI>
- trouver le maximum dans le tableau d'occurrence li>
- renvoie la valeur stockée dans cet index dans le tableau d'origine li>
ol>
De cette façon, vous imitez l'utilisation des cartes avec un autre tableau. P>
Si vous n'êtes pas autorisé à utiliser la collection, vous pouvez essayer ci-dessous le code:
public int getPopularNumber(){
int inputArr[] = {1, 2, 3, 4, 4, 5 ,4 ,5 ,5}; // given input array
int[] tempArr = new int[inputArr.length];
int[] maxValArr = new int[inputArr.length];
// tempArr will have number as index and count as no of occurrence
for( int i = 0 ; i < inputArr.length ; i++){
tempArr[inputArr[i]]++;
}
int maValue = 0;
// find out max count of occurrence (in this case 3 for value 4 and 5)
for( int j = 0 ; j < tempArr.length ; j++){
maValue = Math.max(maValue, tempArr[j]);
}
int l =0;
// maxValArr contains all value having maximum occurrence (in this case 4 and 5)
for( int k = 0 ; k < tempArr.length ; k++){
if(tempArr[k] == maValue){
maxValArr[l] = k;
l++;
}
}
return maxValArr[(int)(Math.random() * getArraySize(maxValArr))];
}
private int getArraySize(int[] arr) {
int size = 0;
for( int i =0; i < arr.length ; i++){
if(arr[i] == 0){
break;
}
size++;
}
return size;
}
C'est dur comme l'enfer: D Après avoir essayé, je suppose que je suppose que je l'ai (s'il y aura 2 chiffres avec la même fréquence, il sera d'abord retrouvé trouvé):
public static void main(String[] args) {
//income array
int[] array= {1,1,1,1,50,10,20,20,2,2,2,2,20,20};
//associated unique numbers with frequency
int[][] uniQFreqArr = getUniqValues(array);
//print uniq numbers with it's frequency
for (int i = 0; i < uniQFreqArr.length; i++) {
System.out.println("Number: " + uniQFreqArr[i][0] + " found : " + uniQFreqArr[i][1]);
}
//get just most frequency founded numbers
int[][] maxFreqArray = getMaxFreqArray(uniQFreqArr);
//print just most frequency founded numbers
System.out.println("Most freq. values");
for (int i = 0; i < maxFreqArray.length; i++) {
System.out.println("Number: " + maxFreqArray[i][0] + " found : " + maxFreqArray[i][1]);
}
//get some of found values and print
int[] result = getRandomResult(maxFreqArray);
System.out.println("Found most frequency number: " + result[0] + " with count: " + result[1]);
}
//get associated array with unique numbers and it's frequency
static int[][] getUniqValues(int[] inArray){
//first time sort array
Arrays.sort(inArray);
//default value is null, not zero as in int (used bellow)
Integer[][] uniqArr = new Integer[inArray.length][2];
//counter and temp variable
int currUniqNumbers=1;
int actualNum = inArray[currUniqNumbers-1];
uniqArr[currUniqNumbers-1][0]=currUniqNumbers;
uniqArr[currUniqNumbers-1][1]=1;
for (int i = 1; i < inArray.length; i++) {
if(actualNum != inArray[i]){
uniqArr[currUniqNumbers][0]=inArray[i];
uniqArr[currUniqNumbers][1]=1;
actualNum = inArray[i];
currUniqNumbers++;
}else{
uniqArr[currUniqNumbers-1][1]++;
}
}
//get correctly lengthed array
int[][] ret = new int[currUniqNumbers][2];
for (int i = 0; i < uniqArr.length; i++) {
if(uniqArr[i][0] != null){
ret[i][0] = uniqArr[i][0];
ret[i][1] = uniqArr[i][1];
}else{
break;
}
}
return ret;
}
//found and return most frequency numbers
static int[][] getMaxFreqArray(int[][] inArray){
int maxFreq =0;
int foundedMaxValues = 0;
//filter- used sorted array, so you can decision about actual and next value from array
for (int i = 0; i < inArray.length; i++) {
if(inArray[i][1] > maxFreq){
maxFreq = inArray[i][1];
foundedMaxValues=1;
}else if(inArray[i][1] == maxFreq){
foundedMaxValues++;
}
}
//and again copy to correctly lengthed array
int[][] mostFreqArr = new int[foundedMaxValues][2];
int inArr= 0;
for (int i = 0; i < inArray.length; i++) {
if(inArray[i][1] == maxFreq){
mostFreqArr[inArr][0] = inArray[i][0];
mostFreqArr[inArr][1] = inArray[i][1];
inArr++;
}
}
return mostFreqArr;
}
//generate number from interval and get result value and it's frequency
static int[] getRandomResult(int[][] inArray){
int[]ret=new int[2];
int random = new Random().nextInt(inArray.length);
ret[0] = inArray[random][0];
ret[1] = inArray[random][1];
return ret;
}
Au lieu de garder une trace d'un seul "populaire", gardez une trace d'une liste. Plus tard, vous en choisissez un de la liste de manière aléatoire.
Deux choses que j'ai remarquées, cela pourrait aider. Tout d'abord, dans votre première boucle, votre état est i <(Array.length - 1). Cela manquera la dernière entrée de la matrice. Est-ce ce que vous voulez faire? Deuxièmement, dans la première déclaration si vous avez omis les accolades. C'est bon et est un code valide, mais la façon dont vous avez en retrait le code suggère que cela ne va pas faire ce que vous pensez. C'est généralement une bonne pratique d'inclure les accolades.
Renvoie Le premier B> est conforme à ma notion de un aléatoire b>. Mais je ne suis pas votre professeur et je ne sais pas s'il y a un phrasé plus spécifique pour vos devoirs.
Je n'obtiens pas ce que le problème est ici, voulez-vous que la méthode renvoie parfois 5 et parfois 4 dans le cas où vous avez fourni? @ewanc
i <(array.length - 1) code> Il n'a pas besoin de vérifier le dernier élément car il aura déjà fouillé tous les autres numéros. Si ce numéro est unique à la liste, alorsArray [0] code> est tout aussi bon qu'une sélection quetableau [Array.longueur-1] code>@Dotvav, je ne suis pas d'accord, mais mélanger le tableau au hasard le résoudrait au hasard.
Il doit revenir 4 ou 5 au hasard (dans le cas où j'ai donné). À l'heure actuelle, cela apporte toujours le premier. @dotvav bien peut-être que vous avez raison et c'est une question de savoir comment vous définissez "aléatoire"? lol je vais demander à l'enseignant de cela.
@ug_ pas nécessairement. Dans l'exemple prévu ci-dessus, si vous ignorez le dernier élément, le comptage pour 4 est supérieur au nombre de 5, donc 4 est toujours la seule réponse.
@ Avishay28 Demandez à votre professeur de clarification - il est bien possible qu'il veuille un résultat arbitraire B> (des plus populaires), ce qui signifie que vous pouvez choisir quel que soit votre choix, plutôt que aléatoire B> résultat.
Habituellement "Choisir une solution aléatoire" signifie "choisir n'importe qui", il n'y a pas de requête "réelle" aléatoire. Il est obligatoire habituellement seulement dans la tâche lorsque le réel aléatoire est important (des statistiques des choses, etc.)
Je soupçonne fortement que l'enseignant signifie "si deux ont la même fréquence, celle sélectionnée n'a pas d'importance" plutôt que "un numéro sélectionné au hasard". Mais vous devriez vérifier cela d'abord avec votre professeur.
@Libik - "Habituellement ..." I> - Cela dépend vraiment de qui vous parlez. Par exemple, les statisticiens et les adolescents utilisent le mot «aléatoire» avec des significations très différentes. Le cours sage serait ici de lire attentivement les exigences et de demander des éclaircissements s'il n'est pas clair / ambigu.
Dupliqué possible de Déterminer l'occasion la plus courante dans un tableau
Dupliqué possible de Java - Trouvez l'élément le plus populaire de Int [] Array
Techniquement, la sélection de la première fois que aléatoire . :)