格雷编码
难度:中等
题目描述
n 位格雷码序列 是一个由 2n
个整数组成的序列,其中:
- 每个整数都在范围
[0, 2n - 1]
内(含0
和2n - 1
) - 第一个整数是
0
- 一个整数在序列中出现 不超过一次
- 每对 相邻 整数的二进制表示 恰好一位不同 ,且
- 第一个 和 最后一个 整数的二进制表示 恰好一位不同
给你一个整数 n
,返回任一有效的 n 位格雷码序列 。
示例1
输入: n = 2
输出:[0,1,3,2]
示例2
输入: n = 1
输出:[0,1]
题解
依题意得,数组的第一个元素必定是0
,依据之后的规律可以发现,需要用到位运算
定义temp
为中间变量,令
t
e
m
p
=
1
<
<
(
n
−
1
)
temp = 1 << (n-1)
temp=1<<(n−1) 即每一次循环中,temp都可以取到每一次遍历的位运算数
定义一个List
表,第一个元素为0
,之后每一次遍历都需要对当前数组添加数据,添加的数据内容为让当前List
表中的元素与temp
进行按位或运算对的值
遍历到最后将List
表返回即为最终结果
想法代码
class Solution
{
public static void Main(String[] args)
{
int n = 2;
Solution solution = new Solution();
IList<int> ans = solution.GrayCode(n);
foreach (int i in ans)
{
Console.Write(i + ",");
}
}
public IList<int> GrayCode(int n)
{
if (n == 0)
{
return new List<int>(){0};
}
var lastTime = GrayCode(n - 1);
var temp = 1 << (n-1);
for (var i = lastTime.Count - 1; i >= 0; i--)
{
lastTime.Add(lastTime[i] | temp);
}
return lastTime;
}
}