[Leetcode] 89. 그레이 코드 (그레이 코드 + 비트 연산 + 시뮬레이션)

제목 설명

그레이 코딩은 두 개의 연속 값이 한 자리 만 다른 이진수 시스템입니다.
코드의 총 자릿수를 나타내는 음이 아닌 정수 n이 주어지면 회색 코드 시퀀스를 인쇄합니다. 여러 개의 다른 답변이 있더라도 그중 하나만 반환하면됩니다.
회색 코드 시퀀스는 0으로 시작해야합니다.

예 1 :

입력 2
출력 [0,1,3,2]
설명 :
00-0
. 01-1
.. 11 - 3
2 - 10
코딩 서열 고유 골 레이가 아닌 주어진 N에 대한.
예를 들어, [0,2,3,1]도 유효한 회색 코드 시퀀스입니다.
00-0
10 - 2
11 - 3
01 - 1

예 2 :

입력 : 0
출력 : [0]
설명 : 회색 코드 시퀀스는 0으로 시작해야 함을 정의합니다.
총 자릿수가 n 인 회색 코드 시퀀스의 경우 길이는 2n입니다. n = 0이면 길이는 20 = 1입니다.
따라서 n = 0 일 때 그레이 코드 시퀀스는 [0]입니다.

주제 링크 : 89. 회색 코딩

아이디어 :

  • 먼저 그레이 코드의 구성 방법을 이해해야합니다. 알려진 iii 자리 그레이 코드, 그냥iii- bit Gray 코드 미러링 , 전반부 앞에 0을 채우고 후반부에 1을 더하여i + 1 i + 1을 얻습니다.나는+1 회색 코드.

  • 제목의 출력은 회색 코드로 표시되는 십진수이고 앞에 0을 추가해도 십진수는 변경되지 않으므로 i + 1 i + 1나는+1 자리 그레이 코드의 앞부분과iii- bit 회색 코드는 일관됩니다.

  • 마지막 접근 방식은 0, 1, 2, ⋅ ⋅ ⋅, n 0, 1, 2, ···, n을 단계적으로 구성하는 것입니다.0 , 1 , 2 , , N 비트 회색 코드,iii 비트 회색 코드는i − 1 i-1만 있으면됩니다.나는1 자리 그레이 코드i << 1의 각 숫자에i << 1 추가나는<<1 (iii 위치는 1)이고 미러링하여 답 배열에 추가합니다.

  • 그레이 코드 미러 구성 방법은 다음과 같습니다. 여기서 이진수는 해당 십진수입니다.

1 자리 그레이 코드 2 자리 회색 코드 3 자리 회색 코드 4 자리 그레이 코드
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 ++ 코드 :

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;
    }
};

추천

출처blog.csdn.net/IAMLSL/article/details/115268874