问题描述
The gray code is a binary numeral system where two successive values differ in only one bit.
Given a non-negative integer n representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0.
For example, given n = 2, return [0,1,3,2]. Its gray code sequence is:
00 - 0
01 - 1
11 - 3
10 - 2
Note:
For a given n, a gray code sequence is not uniquely defined.
For example, [0,2,3,1] is also a valid gray code sequence according to the above definition.
For now, the judge is able to judge based on one instance of gray code sequence. Sorry about that.
解题思路
该问题给我们一个数字n,要求生成n为的格雷码。考虑到格雷码相邻两个二进制数只能在一位上有差异,所以我们可以用一种从最低为开始,逐位加一的方法去解决这个问题。
我们以n=3为例。我们可以令一开始的数为000,然后在最低位加一,得到:
000
001
然后我们在上述已知的格雷码中,从下往上在次低位加一:
000
001
011
010
这里要注意加一的顺序,必须要从下往上加,因为新增加的数字如果是从上往下产生的,那么就相当于是同时在多个位上发生改变,而从下往上加可以确保只有一位发生了改变,又因为原先有的相邻格雷码之间只有一位有区别,如果在同一个位置上都加一,相邻两个之间的差异仍然只有一,因此性质还是成立的。
最后我们在最高位上加一,注意还是要从下往上:
000
001
011
010
110
111
101
100
代码展示
#include <iostream>
#include <stdlib.h>
#include <string>
#include <vector>
using namespace std;
class Solution {
public:
vector<int> grayCode(int n) {
vector<int> res(1, 0);
for (int i = 0; i < n; ++i) {
int size = res.size();
while (size--) {
int curNum = res[size];
curNum += (1 << i);
res.push_back(curNum);
}
}
return res;
}
};
int main(){
int n;
cout<<"请输入位数n:";
cin>>n;
Solution solution;
vector<int> result=solution.grayCode(n) ;
for(int i=0;i<result.size();i++){
cout<<result[i]<<" ";
}
cout<<endl;
}
运行结果