class Solution {
public:
vector<int> circularPermutation(int n, int start) {
vector<int>ans(1<<n);//创建一个2的n次方的数量的数组
int temp;
for(int i=0;i<ans.size();i++){//格雷码转换
ans[i]=i^(i>>1);
if(ans[i]==start) temp=i;
}
reverse(ans.begin(),ans.begin()+temp);//在start之前的翻转
reverse(ans.begin()+temp,ans.end());//在start之后的翻转
reverse(ans.begin(),ans.end());//不用担心头尾不符合规则,因为0和2^n的二进制只差一位
return ans; }
};
补充知识:格雷码,平常二进制不是差一位排列,而格雷码是这样的性质,就需要转换为格雷码
格雷码和二进制可以参考这一篇
还有要注意的是stl.reverse的用法
反转范围中元素的顺序[first,last)。
如果是交换数值的话,用swap// defined in <algorithm> before C++11template <class T> void swap (T& a, T& b);