LeedCode OJ的一个题目:
Gray Code Total Accepted: 2370 Total Submissions: 7783 My Submissions
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个数字的结果集合为A[n],观察可以得到,A[n+1]的结果由两部分组成:
步骤1、原始的A[n],可以理解为每个元素的第n+1位设置为0;
步骤2、集合B[n],B中每个元素为A中每个元素倒序访问时,第n+1位设置为1的结果保存;
步骤3、将B[n]的元素依次接到A[n]的后面,记得到A[n+1]。
例如:n=2,时,返回A[2]=[0,1,3,2],即:
00 - 0
01 - 1
11 - 3
10 - 2
下面是求A[3]的过程:
根据步骤1:A[2]=[0,1,3,2]不变;
根据步骤2:A[2]倒序即为[2,3,1,0],也就是:
10 - 2
11 - 3
01 - 1
00 - 0
第n+1=3位设置为1,得到:
110 - 6
111 - 7
101 - 5
100 - 4
所以B[2]=[6,7,5,4]
根据步骤3:A[3]=A[2]+B[2]=[2,3,1,0,6,7,5,4]
说明正确性:当A[n]是满足要求的时,将其倒序后第n+1位值1,很显然B[n]单独也是满足要求的;然后把A[n]和B[n]连接起来,由于B的第一个元素就是A中最后一个元素的高位置1的结果,那么连接以后整体结果也是满足题意的,故该方法是可行的。
具体代码很简单,如下:
class Solution {
public:
vector<int> grayCode(int n) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
vector<int> result;
if(n>=0)
result.push_back(0);
for(int i=1;i<=n;i++)
{
int shift=1<<(i-1);
for(int index=result.size()-1;index>=0;index--)
result.push_back(result[index]|shift);
}
return result;
}
};