好题,自己做出来的,花了一个多小时,不到两个小时,面试时估计可没有这么多时间。这样的题就是一点一点的找规律,然后转化为计算机算法。首先0先进入结果集,之后就是怎么交换的问题了,假n=3,刚开始为000,从左往右分别共交换1,2,4次,共7次正好7个数,而且两次交换的位置不能相同,所以交换的顺序为4241424(用次数来表示),4表示交换最后一位,2表示交换中间位,1表示交换第一位。能交换低位(右边的)尽量交换低位,不能交换低位再交换低位的前一位,什么时候是不能交换了呢,就是当前位刚刚被交换过了。所以每个位只有两种状态,可以用二进制表示,设置一个数组表示二进制数就可以了,之后的每一位相当于末位加一的操作,该进位的进位,当进位大于等于n时就结束了。n=3时,依次是000,001,011,010,110,111,101,100。 代码如下:
// LeetCode_GrayCode.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> grayCode(int n) {
vector<int> ret;
ret.push_back(0);
if(n==0)
return ret;
int *bit = new int[n];
for (int i=0;i<n;i++)
bit[i] = 0;
int num=0;
int factor,k;
while(1)
{
k = 0;
while(k<n&&bit[k]!=0)
{
bit[k] = 0;
k++;
}
if(k==n)
break;
bit[k] = 1;//该修改哪一位
factor = 1<<k;
num = num^factor;//修改的那位与1异或
ret.push_back(num);
}
delete[] bit;
return ret;
}
int _tmain(int argc, _TCHAR* argv[])
{
int n;
while(cin>>n)
{
vector<int> ret;
ret = grayCode(n);
vector<int>::iterator iter = ret.begin();
while(iter!=ret.end())
{
cout<<*iter<<endl;
iter++;
}
}
system("pause");
return 0;
}