LeetCode 题解:1238. 循环码排列,归纳法,详细注释
原题链接:https://leetcode.cn/problems/circular-permutation-in-binary-representation/
前置条件:
格雷编码可以满足题目的条件“
p[i]
和p[i+1]
的二进制表示形式只有一位不同”,以及“p[0]
和p[2^n -1]
的二进制表示形式也只有一位不同”我们需要将格雷编码转换成以
start
开头的一串编码即可为何要用异或:
格雷编码的第一个是
0
,可以得知0 ^ start = start
回顾一下异或操作,可以知道如果对每一位都进行异或操作,每一位之间的逻辑关系的变化是同步的
也就是说,
p[i]
和p[i+1]
的相互关系,以及p[0]
和p[2^n -1]
的相互关系不会改变 a | b | a XOR b---|---|---------0 | 0 | 00 | 1 | 11 | 0 | 11 | 1 | 0
解法一:两次循环:
按照89.格雷编码的方法求出格雷编码
将格雷编码的每一位都按位异或
start
,即可求得结果
复制代码
解法二:
可以在解法一的基础上,将第二步的异或操作,放到第一步的第二层循环中,具体方法如下:
每次查找
result
中的元素时,将其异或start
,将其转为格雷编码给格雷编码加上前缀
1
存入
result
时,将其异或start
,转为以start
开头的编码
复制代码
版权声明: 本文为 InfoQ 作者【Lee Chen】的原创文章。
原文链接:【http://xie.infoq.cn/article/1acb780bf7482493bbc779933】。文章转载请联系作者。
评论