格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。
给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。对于给定的 n,其格雷编码序列并不唯一。
这道题有点不确定。我的思路是相邻两个数的二进制码 异或 后只有一个1,下一个数都从第一个数开始遍历以免租后输出的各类编码长度不够。执行都没问题,提交后n=10时报错。由于格雷编码答案不唯一可能有很多种,所以不好判断我的错没错。但我的思路应该是没问题的,欢迎批评指正。
C++用的是标准库函数。
python:
class Solution(object):
def grayCode(self, n):
"""
:type n: int
:rtype: List[int]
"""
res = [0]
i = 1
while i < 2**n:
if bin(res[-1]^i).count('1') == 1:
if i not in res:
res.append(i)
i = 1
else:
i += 1
else:
i += 1
return res;
C++:
class Solution {
public:
vector<int> grayCode(int n) {
if(n == 0) {
vector<int> sol;
sol.push_back(0);
return sol;
} else {
vector<int> previous = grayCode(n - 1);
vector<int> sol(previous);
for(int i = previous.size() - 1; i >= 0; --i) {
sol.push_back((int)pow(2.0, n - 1) + previous[i]);
}
return sol;
}
}
};