题目:
给你两个整数 n 和 start。你的任务是返回任意 (0,1,2,,...,2^n-1) 的排列 p,并且满足:
p[0] = startp[i]和p[i+1]的二进制表示形式只有一位不同p[0]和p[2^n -1]的二进制表示形式也只有一位不同 算法: 方法一:格雷编码+循环右移
func circularPermutation(n int, start int) []int {
ans := []int{0}
k := 0
for i := 0; i < n; i ++ {
flag := 1 << i
for j := len(ans) - 1; j >= 0; j-- {
val := ans[j] + flag
ans = append(ans, val)
if val == start {
k = len(ans) - 1
}
}
}
m := len(ans)
tmp := make([]int, m)
// 右移offetg个位置,让start在数组第一位
offset := m - k
for i := 0; i < m; i ++ {
tmp[(i + offset) % m] = ans[i]
}
copy(ans, tmp)
return ans
}