Étant donné un tableau d'entiers où certains nombres de répétition 1 fois ou 2 fois, mais un nombre répète 3 fois, comment avez-vous trouver?
Donné un tableau d'entiers où certains nombres de répétition 1 fois, certains numéros de répéter 2 fois, et seulement un nombre répète 3 fois, comment trouvez-vous le nombre, qui se répète 3 fois. À l'aide de hachage n'a pas été autorisé. La complexité de l'algorithme O(n)
- stackoverflow.com/questions/555744/...
- La loi Dodd - je suis un peu tendance à être d'accord avec vous, mais basé sur ce que polygenelubricants posté, je pense qu'il y est une façon intelligente de le faire. Je ne peux pas la comprendre, mais je suis impatient de savoir quelle est la réponse!
- en utilisant le hachage, est-ce à dire que vous ne pouvez pas utiliser des cartes/dictionnaires ou tout simplement que vous ne pouvez pas utiliser une fonction de hachage sur chaque numéro de la comprendre?
- Wow, vous êtes vraiment coller à votre titre hein.
- Double + besoins devoirs tag ?
- toute la question est terminée, je suis encore à essayer de trouver la solution. ce n'est pas un problème, je suis en train de préparer pour une entrevue
- Pourquoi ne pas vous être autorisé à utiliser le hachage? Le hachage solution la plus simple est la bonne réponse à la question qui satisfait les contraintes.
- C'est la même question ici: discuss.joelonsoftware.com/default.asp?interview.11.790844 Personne ne sait comment le résoudre il soit.
- Dans le joel on software discussion, il y a effectivement une exigence supplémentaire:
O(1)
espace, et c'est encore plus difficile.
Vous devez vous connecter pour publier un commentaire.
Je suppose que le tableau n'est pas trié, ou de même, les répétitions d'un certain nombre n'apparaissent pas dans une seule course. Sinon, le problème est vraiment trivial: il suffit de scanner le tableau une fois avec une fenêtre de taille 3, et si chaque nombre dans cette fenêtre est la même, c'est le nombre qui se répète 3 fois en une seule exécution.
Si les répétitions sont dispersés, alors le problème devient plus intéressant.
Puisque c'est les devoirs, je vais seulement vous donner un indice.
Ce problème est un cousin de l'endroit où vous êtes donné un tableau d'entiers non triés, et tous les numéros apparaissent un nombre pair de fois, à l'exception de celui qui apparaît un nombre impair de fois.
Ce numéro peut être trouvé assez facilement dans
O(N)
par l'exécution d'un ou-exclusif de tous les nombres dans le tableau; le résultat est le nombre qui apparaît un nombre impair de fois.La raison pour laquelle cela fonctionne est que
x xor x = 0
.Ainsi, par exemple,
3 xor 4 xor 7 xor 0 xor 4 xor 0 xor 3 = 7
.Utilisation radix sort (qui est linéaire en le nombre de bits requis pour spécifier les nombres entiers), puis de l'analyse pour le triplet.
Voici une réponse qui suppose max(A) est raisonnablement petit, où A est le tableau d'entrée:
Essentiellement, le problème est de calculer la mode de la matrice. Cette solution fonctionne "SEULEMENT" si le tableau de la gamme [0,n-1]. Mettre la solution ici, puisque le problème n'est pas de mettre une clause de la gamme.
C'est O(n) O(1) espace (mais avec une clause range).
Je ne suis pas au courant de tout algorithme pour calculer la mode en temps O(n),O(1) avec pas de clauses sur la plage.
Bien tout ce que je peux penser à est de cela, mais je suis sûr que votre prof est à la recherche d'une délicate équation qui permettra de résoudre ce dans 1 scan. Vous pouvez le faire dans les 2 scans qui est O(n) en supposant que vous pouvez créer un 2ème tableau de taille (de 0 à max nombre dans le 1er tableau). Scan une fois, trouver le nombre maximal de numéros dans le tableau. Créer 2e tableau de cette taille. Itération sur le 1er tableau, en utilisant à nouveau le 2ème tableau, comme des seaux pour incrémenter le nombre de chaque élément dans le 1er tableau. Une fois que vous incrémenter un seau à 3, c'est votre solution. Pas le meilleur, mais il pourrait fonctionner dans certains cas.
je ne vois pas ce que tout le monde est sur:
à l'aide de python 2.6
et une fonction simple qui va sur la liste, les chiffres les événements, une fois qu'il trouve un certain nombre qui se produit 3 fois, la renvoie.
Bugaoo l'algorithme de l'air soigné, qui est cité ci-dessous. En fait, on peut généraliser en faisant un supplément de passer avant "1er pass" pour trouver min () et max(A) et d'un supplément de passer pour déplacer chaque élément de la gamme de la fonction min () et max(A), c'est à dire, Un[0]-min(A). Après un 1er passage" et "2ème pass" (notez que nous devrions mod les éléments par max(A)-min(A) au lieu de n), on pourrait ajouter min(A), le double du nombre trouvé à la dernière.
Si vous connaissez min et max de l'entier de la séquence et min>=0, créer un tableau [min, max] rempli avec des zéros.
Analyse le tableau donné et si je se passe, incrémenter i-ème position. Après avoir terminé, vous avez la fréquence de la table dans le second tableau, où le tableau de la position des points sur un entier.
S'il vous plaît excusez le mélange de langues 🙂 Aussi, c'est vraiment stupide d'avoir un tableau qui peut être indexé par un entier quelconque, vous pouvez le faire sur un système 64 bits, et il est conforme aux exigences.
Cet Algorithme semble assez bon.... mais je ne sais pas sa mise en œuvre.. Seulement pseudocode.... Si any1 bon essayer ses mains sur le code(programmation en C), alors s'il vous plaît poster....
De pseudo ici...
Prendre deux bitset des tableaux de taille n. Nous pouvons utiliser ce tableau pour compter jusqu'à trois occurrences, c'est à dire si tableau1[i] = 1 et tableau2[i] = 1, alors cela signifie que nous avons trois occurrences de i+1) ème élément.
pour chaque entier "i"
si(tableau2[i] == 1)
tableau2[i] = 0, tableau1[i] = 1;
d'autre
tableau2[i] = 1;
pour chaque élément K dans les tableaux de
if (tableau1[k] && tableau2[k])
de retour k;
Complexité = O(n) et Espace = 2n bits.
Je vais vous présenter une solution qui fonctionne, en général, tels qu'un numéro de produit
m
times et d'autresn
fois.Nous avons besoin d'un opérateur qui annule
n
occurrences d'un nombre entier, mais conservem
occurrences. Si l'on convertit chaque numéro de sa représentation binaire, et pour chaque position de bit, compter le nombre de fois que ce bit est défini, la valeur sera un multiple den
pour tous les nombres qui se produisentn
fois, plus0
oum
pour le bit correspondant de la lone entier.Si nous prenons ensuite modulo
n
de chacune de ces chiffres, et diviser parm
, le résultat est la valeur du bit correspondant pour le seul entier. Tout ce qui reste est de convertir le résultat en binaire à décimal formelle.