Example 1: Input: 2 Output: [0,1,3,2] Explanation: 00 - 0 01 - 1 11 - 3 10 - 2
在解决此问题之前,让我们了解什么是格雷码。
在了解格雷码之前,我们将了解二进制格式。
以下是一些数字及其二进制表示形式:
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111
如果我们检查两个连续数字之间的位差将如下:
0和1之间的位差为1。因为仅更改了最左边的位。
1和2之间的位差为2。因为2nd 位从0更改为1,第三位从1更改为0。
同样,3和4之间的位差为3。因为所有3位数字都已更改。
在计算机中,这是一个问题,因此我们使用格雷码系统。在格雷码系统中,任何两个连续数字之间的差始终为1。
因此,要编写格雷代码,我们从000开始。
000
001
011
010
110
111
101
100
在上面的列表中,任意2个连续数字之间的差异仅为1位差异。
因此,根据我们的问题,“ n”代表代码中的位数。
对于n = 2,格雷码可编写如下:
由于格雷码从00开始,
00
01
11
10
如果将它们转换为十进制格式,则将为[0,1,3,2]。因此,解决方案。
要获得第N个元素的格雷码,我们使用以下公式:
N ^ floor(N/2)
C ++解决方案
#include<iostream> #include<vector> #include<cmath> using namespace std; std::vector<int> get_grey_code(int n) { vector <int> result; if (n == 0) { result.push_back(0); return result; } for (int i = 0; i < pow(2, n); i++) { result.push_back(i ^ (i / 2)); } return result; } int main() { int n = 2; vector<int> result = get_grey_code( n ); for (int i = 0; i < result.size(); ++i) { cout<< " "<< result[i]<<endl; } }
输出:
0 1 3 2
该网站上可用的教程列表:
C编程20+章 | C ++编程80+章 |
100多个编码问题 | 数据结构和算法85+章 |
系统设计20+章 | Shell脚本编写12章 |
4g LTE 60+章节 | 最常见的编码问题 |
5G NR 50+章 | Linux系统编程20+章 |