Comment trouver si deux nombres sont des nombres consécutifs en gris séquence de code
Je suis en train d'essayer de trouver une solution au problème donné deux numéros, savoir si ils sont les numéros consécutifs dans le gris de la séquence de code c'est à dire, si ils sont gris code voisins en supposant que le gris de la séquence de code n'est pas mentionné.
J'ai cherché sur différents forums, mais ne pouvait pas obtenir la bonne réponse. Ce serait formidable si vous pouvez fournir une solution pour ce.
Une tentative de ma part pour le problème de Convertir des deux entiers en binaire et ajouter les chiffres dans les deux numéros séparément et trouver la différence entre la somme des chiffres dans les deux numéros. Si la différence est l'une puis ils sont gris code voisins.
Mais je sens que cela ne marchera pas pour tous les cas. Toute aide est très appréciée. Merci beaucoup d'avance!!!
- a et b sont gris code voisins s'ils ne diffèrent que par un peu, c'est à dire si a XOR b est une puissance de 2.
- Notez qu'ici il y a beaucoup de Gris séquences de code. Avez-vous une séquence spécifique à l'esprit, ou voulez-vous savoir si deux nombres peuvent être des voisins, dans certains Gris séquence de code?
- Merci beaucoup pour vos réponses. Est-il possible de savoir si les deux nombres sont gris code voisins dans une séquence? La séquence n'a pas été précisé dans la question. Je suis venu à travers dans une de ces interviews. Toute aide est très appréciée!!!
Vous devez vous connecter pour publier un commentaire.
J'ai eu à résoudre cette question dans un entretien aussi. L'une des conditions pour que les deux valeurs soient un gris séquence de code, c'est que leurs valeurs ne diffèrent que par 1 bit. Voici une solution à ce problème:
a => b
ne signifie pas queb => a
). »En fait, plusieurs des autres réponses semblent mauvais: il est vrai que les deux binaire réfléchi Gris code voisins diffèrent que par un seul bit (je suppose que par « le » Gris séquence de code, tu veux dire le binaire original reflète Gris séquence de code comme décrit par Frank Gray). Toutefois, cela ne signifie pas que les deux Gris des codes qui diffèrent par un seul bit sont voisins (
a => b
ne signifie pas queb => a
). Par exemple, le Gris des codes de 1000 et 1010 diffèrent que par un peu, mais ne sont pas des voisins (1000 et 1010 sont respectivement de 15 et 12 en décimal).Si vous voulez savoir si deux Gris des codes de
a
etb
sont voisins, vous avez pour vérifier siprevious(a) = b OR next(a) = b
. Pour un Gris code, vous obtenez un seul voisin en positionnant le bit le plus à droite et l'autre voisin peu en inversant les bits à gauche de la droite de bit. Pour le Gris code 1010, les voisins sont 1011 et 1110 (1000 n'est pas l'un d'eux).Si vous obtenez le précédent ou le suivant voisin en feuilletant un de ces bits dépend en réalité de la parité du Gris code. Cependant, puisque nous voulons tous les deux voisins, nous n'avons pas à vérifier pour la parité. Le pseudo-code devrait vous dire si les deux Gris des codes de pays voisins (à l'aide de C-comme des opérations au niveau du bit):
Peu d'astuce ci-dessus:
a & -a
isole le rigthmost de bit en nombre. Nous décalage de bits d'une position vers la gauche pour obtenir le peu dont nous avons besoin pour flip.Hypothèses:
Les entrées a et b sont gris séquences de code binaire réfléchi gris code.
j'.e a et b de bits de codage binaire, gray code des représentations.
Peu de cas de Test:
bits et sont des nombres consécutifs en représentation décimale)
Références:
méthode gTob() utilisé ci-dessus est de rodrigo dans ce post Les voisins en Gris code
Si deux nombres sont en gris séquence de code, ils se distinguent par un chiffre binaire. j'.e le OU exclusif sur les deux nombres renvoie une puissance de 2. Donc, trouver XOR et vérifier si le résultat est une puissance de deux.
Cette solution fonctionne bien pour tous les cas de test écrits par CodeKaichu ci-dessus. J'aimerais savoir si il échoue dans tous les cas.
Une réponse évidente, mais il fonctionne.
Convertir chaque gris code dans sa forme Binaire, la différence entre les deux. Si votre réponse est un équivalent binaire de +1 ou de -1, alors les deux gris codes sont adjacentes.
Ce qui semble être un plus tuer, mais quand vous êtes à l'implantation dans une interview et qui ne savent pas la bonne méthode, cela fonctionne. Aussi, pour optimiser, on peut vérifier le bit de différence de filtre, de manière à ne pas perdre le temps de la conversion et la soustraction des nombres que nous savons pour sûr ne sont pas adjacentes.
Si vous voulez juste pour vérifier si les numéros diffèrent par un seul bit:
Vous pouvez vérifier si deux nombres ne diffèrent que par un peu ou pas, comme suit. Dans cette méthode, la différence dans la longueur des nombres binaires sont pris en charge. Par exemple, la sortie 11 (1011) et 3 (11) sera renvoyé dans le vrai.
Aussi, cela ne résout pas le deuxième critère pour les niveaux de Gris code d'adjacence. Mais si vous voulez seulement de vérifier si les chiffres diffèrent d'un bit, le code ci-dessous va vous aider.