利用之前生成格雷码的方式,本质上就是,利用在生成好的格雷码中找到起始位置,进行拼接
public List circularPermutation(int n, int start) {
List temp = new ArrayList<>();
// 生成所有的格雷码
for(int i = 0; i < 1<<n; ++i) temp.add(i ^ i>>1);
List res = new ArrayList<>();
int flag = -1;
// 找到起始位置
for (int i = 0; i < temp.size() && flag==-1 ; i++)
if (start==temp.get(i))flag=i;
// 插入答案
for (int i = flag; i < temp.size(); i++)
res.add(temp.get(i));
for (int i = 0; i <flag; i++)
res.add(temp.get(i));
return res;
}