[Leetcode] 89. Código Gray (código Gray + operación de bits + simulación)

Descripción del Título

La codificación gris es un sistema numérico binario en el que dos valores consecutivos difieren solo en un dígito.
Dado un número entero no negativo n que representa el número total de dígitos en el código, imprima su secuencia de código Gray. Incluso si hay varias respuestas diferentes, solo necesita devolver una de ellas.
La secuencia del código Gray debe comenzar con 0.

Ejemplo 1:

Entrada: 2
Salida: [0,1,3,2]
Explicación:
00 - 0
01 -. 1.
11 -. 3
10 - 2
para una n dada, que no es una secuencia de codificación de Golay única.
Por ejemplo, [0,2,3,1] también es una secuencia de código Gray válida.
00-0
10 - 2
11 - 3
01 - 1

Ejemplo 2:

Entrada: 0
Salida: [0]
Explicación: Definimos que la secuencia del código Gray debe comenzar con 0.
Dada una secuencia de código Gray con un número total de dígitos de n, su longitud es 2n. Cuando n = 0, la longitud es 20 = 1.
Por lo tanto, cuando n = 0, su secuencia de código Gray es [0].

Enlace del tema: 89. Codificación gris

Ideas:

  • Primero, debemos entender el método de construcción del código Gray: conocido iiCódigo Gray de i- dígitos, solo pongaiiDespués de la duplicación del código de i -bit Gray, complete 0 en el frente de la primera mitad y agregue 1 al frente de la segunda mitad para obteneri + 1 i + 1I+1 código Gray.

  • Dado que la salida en el título es un número decimal representado por el código Gray, y agregar 0 al frente no cambia el número decimal, entonces i + 1 i + 1I+La primera mitad del código Gray de 1 dígito yiiEl código de i -bit Gray es coherente.

  • El enfoque final es construir 0, 1, 2, ⋅ ⋅ ⋅, n 0, 1, 2, ···, n paso a paso0 1 2 , Código Gray de N bits,iiEl código Gray de i- bit solo necesita seri - 1 i-1I-Agreguei << 1 acada número de código Gray de 1 dígitoi << 1I<<1 (juega eliiLa posición i es 1) y agréguela a la matriz de respuesta mediante la duplicación.

  • El método de construcción del espejo del código gris es el siguiente, donde el número binario es el número decimal correspondiente:

Código Gray de 1 dígito Código Gray de 2 dígitos Código Gray de 3 dígitos Código Gray de 4 dígitos
0 (0) 00 (0) 000 (0) 0000 (0)
1 (1) 01 (1) 001 (1) 0001 (1)
11 (3) 011 (3) 0011 (3)
10 (2) 010 (2) 0010 (2)
110 (6) 0110 (6)
111 (7) 0111 (7)
101 (5) 0101 (5)
100 (4) 0100 (4)
1100 (12)
1101 (13)
1111 (15)
1110 (14)
1010 (10)
1011 (11)
1001 (9)
1000 (8)

Código C ++:

class Solution {
    
    
public:
    vector<int> grayCode(int n) {
    
    
    vector<int>res(1<<n,0);   //n位格雷码有2^n个元素
    int i=0,p=0;     //i表示第i位格雷码,p表示“镜像的分界面”       
    while(i<n){
    
    
    for(int l=p,r=p+1;l>=0;l--,r++){
    
    
    res[r]=res[l]+(1<<i);  //将l处的元素前面添1放到镜像r处 
    }
    i++;          //增加“格雷码位数"
    p=(1<<i)-1;   //更新“分界面”
    }
    return res;
    }
};

Supongo que te gusta

Origin blog.csdn.net/IAMLSL/article/details/115268874
Recomendado
Clasificación