제목 설명
그레이 코딩은 두 개의 연속 값이 한 자리 만 다른 이진수 시스템입니다.
코드의 총 자릿수를 나타내는 음이 아닌 정수 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;
}
};