1238. 循环码排列

79 阅读1分钟

题目:
给你两个整数 nstart。你的任务是返回任意 (0,1,2,,...,2^n-1) 的排列 p,并且满足:

  • p[0] = start
  • p[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
}