方法1: 这道题目我只推荐这个方法1。其实就是找规律,详细解释看这篇帖子。bit操作真的是一点也不熟悉,快把我整疯了。
class Solution {
public List<Integer> grayCode(int n) {
List<Integer> gray = new ArrayList<Integer>();
gray.add(0); //初始化 n = 0 的解
for (int i = 0; i < n; i++) {
int add = 1 << i; //要加的数,1的右边加上i个0;
//倒序遍历,并且加上一个值添加到结果中
for (int j = gray.size() - 1; j >= 0; j--) {
gray.add(gray.get(j) + add);
}
}
return gray;
}
}
方法2: 说是说这是backtracking,但是我觉得本质和方法1是一样的,都需要先找到这个规律。这个代码我看了一小时没看懂为什么这样写,但是还是展示一下,希望复盘的时候可以看懂,如果大家看懂的话也欢迎给我解释一下,谢谢!
class Solution {
int nums = 0;
public List<Integer> grayCode(int n) {
List<Integer> ret = new ArrayList<>();
backTrack(n, ret);
return ret;
}
private void backTrack(int n, List<Integer> ret) {
if (n == 0) {
ret.add(nums);
return;
}
else {
backTrack(n - 1, ret);
nums ^= (1 << n - 1);
backTrack(n - 1, ret);
}
}
}
总结:
- 无