题目
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。
给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。即使有多个不同答案,你也只需要返回其中一种。
格雷编码序列必须以 0 开头。
思路
如果单单找出这些数,那就很简单。结果我就是左看右看没发现两个相邻的格雷码之间的二进制形式只能相差一位!
其实用二进制形式来看就简单了,每次都在当前的所有数字前面叠加1或者0.(0的话其实不用加,加了对结果没影响)。加1,因为考虑到要相邻两个数的位置只能由一个二进制位的不同,所以将其翻转过来添加即可,(即从列表的尾部开始添加)!
然后,添加1,其实每次将1往左移动一位就可以了!
代码
import java.util.ArrayList;
import java.util.List;
class Solution {
public List<Integer> grayCode(int n) {
ArrayList <Integer>ans=new ArrayList<>();
ans.add(0);
if (n==0)
{
return ans;
}
int num=1;
for (int i=0;i<n;++i)
{
for (int j=ans.size()-1;j>=0;--j)
{
ans.add(num+ans.get(j));
}
num<<=1;
}
return ans;
}
}
结果
要注意看题目,一旦看飘了,那就全部代码都废了!我还以为为啥我想出来这么好的解法居然没有人一样!
要谨慎,小心!
|