解法一:格雷码

满足这种规律很容易想到格雷码,关于格雷码的实现:格雷码
看了评论区大佬的才知道可以对数组元素进行移动,这样就解决了以start为第一个数的要求。

  1. class Solution {
  2. public List<Integer> circularPermutation(int n, int start) {
  3. int len = 1 << n;
  4. List<Integer> ans = new ArrayList<>(len);
  5. for (int i = 0; i < len; ++i) {
  6. ans.add(i ^ (i >> 1));
  7. }
  8. for (int i = 0; i < len; ++i) {
  9. if (ans.get(i) == start) {
  10. Collections.rotate(ans, -i);
  11. break;
  12. }
  13. }
  14. return ans;
  15. }
  16. }