ProDeveloperTutorial.com

教程和编程解决方案
菜单
  • Shell脚本
  • 系统设计
  • Linux系统编程
  • 4g LTE
  • 编码问题
  • C
  • C ++
  • DSA
  • GIT

您得到一个正数“n”,在CPP中打印格雷码解决方案的顺序

前开发者教程 九月9,2018

 

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+章
分享
电子邮件
鸣叫
领英
Reddit
绊倒
Pinterest的
上一篇文章
下一篇

关于作者

前开发者教程

每天我们都会讨论竞争性编程问题,请加入我们的网站:   电报频道

ProDeveloperTutorial.com

教程和编程解决方案
版权© 2020 ProDeveloperTutorial.com
从以下课程获得热门课程: 教育性的