6
votes

Trouver des valeurs dupliquées entre deux tableaux

Disons que j'ai les deux tableaux suivants:

int[] a = [1,2,3,4,5];
int[] b = [8,1,3,9,4];


2 commentaires

Sent comme des devoirs pour moi. Qu'avez-vous si loin?


Quelle est la sortie que vous essayez de produire?


6 Réponses :


8
votes

Oui, vous avez besoin de deux boucles, et oui, imbriquées.

pseudocode il ressemblera à: xxx

maintenant tout ce dont vous avez besoin est de le traduire en java . Comme cela ressemble à un devoir ou à un exercice, vous devez le faire par vous-même.

Aussi, pensez à quelle sortie dont vous avez besoin. Si vous avez juste besoin d'un vrai / de faux si a et b avez des valeurs communes, vous pouvez alors quitter les boucles dès que vous trouverez le premier match. Si vous devez plutôt compter le nombre d'éléments communs entre les tableaux, vous devrez lancer un compteur dans cet ensemble de boucles imbriquées. Je vous laisserai à vous de comprendre cette partie.


0 commentaires

6
votes

Vous avez juste besoin de deux personnes imbriquées pour des boucles xxx

Qu'est-ce que cela se passe à la première valeur d'A et comparer à chaque valeur de B, puis passez à la valeur suivante de A et répétez .


3 commentaires

Ce que chaque personne sort de Stackoverflow et quelles questions elles choisissent de répondre, c'est à eux. Vous êtes certainement libre de dépenser vos votes comme vous le voyez en forme (c'est ce que les votes sont pour), mais la réponse n'est pas techniquement fausse.


Merci! C'est exactement ce que j'avais, sauf lorsque je comparais des valeurs dans la déclaration IF () que je faisais [i] pour les deux chiffres au lieu de [i] pour l'un et l'autre compteur pour l'autre.


Débutant: Si quelqu'un demande de l'aide, je suis heureux de le donner. Sauf si quelqu'un dit "c'est pour les devoirs", alors franchement, je ne fais pas partie d'un conseil d'éducation, je ne connais pas ni ne me souciais de savoir pourquoi ils veulent savoir et ce n'est pas ma place à poser. Cependant, cependant, le point essentiel est que l'administrateur sait maintenant comment effectuer la tâche - éducation complète et sans frais pour le système éducatif.



1
votes

Depuis que vous n'avez pas ce tarif de tarif, je vais vous donner l'avantage du doute. Comme vous l'avez dit, vous aurez besoin de deux boucles; boucle foreach int in A [] et foreach int in b [] . Ensuite, comparez simplement les deux valeurs de chaque itération, ce qui vous donne le code simple de: xxx


8 commentaires

Très probablement OP n'a pas encore eu la possibilité d'ajouter cette étiquette.


@Beginner: Il suffit de regarder votre code, il est à peine différent de la mienne, que ce soit pseudo-code ou non. Tout n'est pas ses devoirs.


Votre code peut être copypassé. Ce est le problème. Mien - pas.


Des réponses en double ne sont pas, en eux-mêmes, de mauvaises réponses, tant que leur contenu technique est correct. C'est mon opinion que, si vous ne pensez pas qu'une question mérite une réponse, que vous ne devriez pas répondre à la question et passer à autre chose, plutôt que de baisser les réponses qui donnent des informations correctes.


@Beginner Avez-vous déjà utilisé le code réel d'Internet comme outil d'apprentissage? J'ai. Vous supposez des mauvaises intentions sans avoir besoin.


@Bryan Oui, il sera utile pour les autres personnes qui visitent ce site ultérieurement pour étudier le code, mais ce n'est en aucun cas utile pour l'OP, à qui cette réponse doit servir en premier lieu.


@Beginner: Comment est-ce exactement inutile à l'OP? Qu'est-ce qu'ils ont mis dans des livres de programmation, des échantillons de code? L'extrait est expliqué et ne dispose que de 3 lignes principales et démontre une boucle foreach par opposition à un pour boucle qui utilise un accès aléatoire pour itérer les matrices. Sauf si ceci est étiqueté comme devoir les devoirs, il n'est en aucun cas inutile. Cela ne me dérange pas du tout des votes, mais je ne vois rien de mal avec la réponse. Les mêmes choses vont pour les autres réponses que vous avez voté.


@Beginner Je comprends votre préoccupation. Mais essayons de bien assumer une bonne foi sur tout le monde.



1
votes

Selon les données (sa taille, si chaque valeur est unique, etc.) et de ce que vous essayez d'en obtenir (c'est-à-dire que chaque élément d'A est en B, ou également son indice en B), il Peut être bénéfique de faire un peu de frais généraux avant de faire la viande. Par exemple, si vous triez les deux tableaux (ce que vous aurez besoin de faire une seule fois), vous pouvez commencer la boucle interne où vous l'avez arrêtée en dernier (puisque vous savez que vous recherchez un numéro> = celui que vous avez recherché Enfin, il faut donc être à cet indice ou plus grand), et vous pouvez également arrêter la boucle intérieure plus tôt (puisque vous savez que si vous recherchez X et que vous ne l'avez pas trouvé avant de voir une valeur> x, puis X n'est pas là). Une autre approche serait de charger les deux valeurs dans un ensemble, que vous pouvez maintenant rechercher efficacement.


0 commentaires

23
votes

Ces solutions prennent toutes l'heure de O (n ^ 2). Vous devez exploiter une solution de hashmap / hashset pour une solution de manière sensiblement plus rapide O (n): xxx


1 commentaires

Ils prennent du temps constant. Pour les grandes valeurs de N, les coûts de recherche seraient négligeables. Vous le proposez est O (n + nk), où k est un peu coûteux? De toute façon, cette solution amortit à O (n).



1
votes
//O(n log(n)), Linear Space Complexity  

void findDuplicates(int[] x, int[] y){
    Arrays.sort(x);
    Arrays.sort(y);
    int i = 0,j = 0;
    while (i < x.length && j < y.length) {
        if(x[i] == y[j]){
            System.out.println(x[i]);
            i++;
            j++;
        }else if (x[i] < y[j])
            i++;
        else
            j++;
    }
}

0 commentaires