格雷

LeetCode 力扣 89. 格雷编码

核能气质少年 提交于 2020-03-09 07:03:05
题目描述(中等难度) 生成 n 位格雷码,所谓格雷码,就是连续的两个数字,只有一个 bit 位不同。 解法一 动态规划 按照动态规划或者说递归的思路去想,也就是解决了小问题,怎么解决大问题。 我们假设我们有了 n = 2 的解,然后考虑怎么得到 n = 3 的解。 n = 2 的解 00 - 0 10 - 2 11 - 3 01 - 1 如果再增加一位,无非是在最高位增加 0 或者 1,考虑先增加 0。由于加的是 0,其实数值并没有变化。 n = 3 的解,最高位是 0 000 - 0 010 - 2 011 - 3 001 - 1 再考虑增加 1,在 n = 2 的解基础上在最高位把 1 丢过去? n = 3 的解 000 - 0 010 - 2 011 - 3 001 - 1 -- -- -- -- -- -- - 下面的是新增的 100 - 4 110 - 6 111 - 7 101 - 5 似乎没这么简单哈哈,第 4 行 001 和新增的第 5 行 100,有 3 个 bit 位不同了,当然不可以了。怎么解决呢? 很简单,第 5 行新增的数据最高位由之前的第 4 行的 0 变成了 1,所以其它位就不要变化了,直接把第 4 行的其它位拉过来,也就是 101。 接下来,为了使得第 6 行和第 5 行只有一位不同,由于第 5 行拉的第 4 行的低位,而第 4 行和第 3

Leetcode(Java)-89. 格雷编码

半城伤御伤魂 提交于 2020-02-16 01:21:20
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。 示例 1: 输入: 2 输出: [0,1,3,2] 解释: 00 - 0 01 - 1 11 - 3 10 - 2 对于给定的 n,其格雷编码序列并不唯一。 例如,[0,2,3,1] 也是一个有效的格雷编码序列。 00 - 0 10 - 2 11 - 3 01 - 1 示例 2: 输入: 0 输出: [0] 解释: 我们定义格雷编码序列必须以 0 开头。 给定编码总位数为 n 的格雷编码序列,其长度为 2n。当 n = 0 时,长度为 20 = 1。 因此,当 n = 0 时,其格雷编码序列为 [0]。 思路:镜像添加 class Solution { public List<Integer> grayCode(int n) { List<Integer> res = new ArrayList<>(); res.add(0); for(int i=1;i<=n;i++) { int j = (int)Math.pow(2,i-1); while(j > 0) { res.add(res.get(j-1)+(int)Math.pow(2,i-1)); j--; } } return res; } } 来源: CSDN

LeetCode-89. 格雷编码

*爱你&永不变心* 提交于 2020-02-02 06:18:34
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。 示例 1: 输入: 2 输出: [0,1,3,2] 解释: 00 - 0 01 - 1 11 - 3 10 - 2 对于给定的 n,其格雷编码序列并不唯一。 例如,[0,2,3,1] 也是一个有效的格雷编码序列。 00 - 0 10 - 2 11 - 3 01 - 1 示例 2: 输入: 0 输出: [0] 解释: 我们定义格雷编码序列必须以 0 开头。 给定编码总位数为 n 的格雷编码序列,其长度为 2n。当 n = 0 时,长度为 20 = 1。 因此,当 n = 0 时,其格雷编码序列为 [0]。 满足镜像排列: #include <iostream> #include <vector> using namespace std; class Solution { public: vector<int> grayCode(int n){ vector<int> result = {0}; for(int i=1;i<=n;i++){ int e = 1<<(i-1); for(int j = result.size()-1;j>=0;j--){ result.push_back(e+result[j]); } }

力扣89——格雷编码

社会主义新天地 提交于 2020-01-17 05:58:14
原题 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。 示例 1: 输入: 2 输出: [0,1,3,2] 解释: 00 - 0 01 - 1 11 - 3 10 - 2 对于给定的 n,其格雷编码序列并不唯一。 例如,[0,2,3,1] 也是一个有效的格雷编码序列。 00 - 0 10 - 2 11 - 3 01 - 1 示例 2: 输入: 0 输出: [0] 解释: 我们定义格雷编码序列必须以 0 开头。 给定编码总位数为 n 的格雷编码序列,其长度为 2n。当 n = 0 时,长度为 20 = 1。 因此,当 n = 0 时,其格雷编码序列为 [0]。 原题url:https://leetcode-cn.com/problems/gray-code/ 解题 初始想法 一开始拿到这题目,我想到的是从0开始,每次从右边第一位开始改变,放入结果集中(集合),如果添加成功,就以当前数为新的起点,继续变化和添加,否则就变化下一位。 这个想法看似美好,实际有两个需要解决的难点: 如何保证转化出的二进制,精确修改每一位呢?如果用 for 循环的话,效率很低。 每次这样改变的话,很可能效率会很低,时间复杂度会很高,如何优化? 基于以上两点,我稍微尝试了一下,感觉这个方法不靠谱

LeetCode-89、格雷编码-中等

你离开我真会死。 提交于 2019-12-12 23:09:39
LeetCode-89、格雷编码-中等 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。 示例 1: 输入: 2 输出: [0,1,3,2] 解释: 00 - 0 01 - 1 11 - 3 10 - 2 对于给定的 n,其格雷编码序列并不唯一。 例如,[0,2,3,1] 也是一个有效的格雷编码序列。 00 - 0 10 - 2 11 - 3 01 - 1 示例 2: 输入: 0 输出: [0] 解释: 我们定义格雷编码序列必须以 0 开头。 给定编码总位数为 n 的格雷编码序列,其长度为 2n。当 n = 0 时,长度为 20 = 1。 因此,当 n = 0 时,其格雷编码序列为 [0]。 代码: class Solution: def grayCode(self, n: int) -> List[int]: res = [0] head = 1 for i in range(n): m = len(res) - 1 for j in range(m, -1, -1): res.append(res[j]+head) head <<= 1 return res # 例:n = 3 # 0 -> 0 -> 0 0 -> 0 0 0 # 1 0 1 0 0 1 # 1

leetcode89.格雷编码

醉酒当歌 提交于 2019-12-12 16:20:54
1.题目描述 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。 示例 1: 输入: 2 输出: [0,1,3,2] 解释: 00 - 0 01 - 1 11 - 3 10 - 2 对于给定的 n,其格雷编码序列并不唯一。 例如,[0,2,3,1] 也是一个有效的格雷编码序列。 00 - 0 10 - 2 11 - 3 01 - 1 示例 2: 输入: 0 输出: [0] 解释: 我们定义格雷编码序列必须以 0 开头。 给定编码总位数为 n 的格雷编码序列,其长度为 2n。当 n = 0 时,长度为 20 = 1。 因此,当 n = 0 时,其格雷编码序列为 [0]。 2.解题思路 通过归纳数字规律可以发现,n+1的结果是:n的结果加上(n的结果逆序中的每一数字+2^n) 3.代码实现 class Solution(object): def grayCode(self, n): """ :type n: int :rtype: List[int] """ i = 0 res = [0] base = -1 while i < n: base += 1 tmp = res[::-1] for j in tmp: res.append(j+2**base) i+=1

【解题报告】CSP2019-S D1T1 格雷码

∥☆過路亽.° 提交于 2019-12-04 16:08:55
题目链接: https://www.luogu.org/problem/P5657 话说这道题怎么是道橙题啊。 基本思路 因为n位格雷码的前2 n-1 位就是n-1位格雷码前面加了一位‘0’,所以可以把它们近似的看作和n-1位格雷码相同 寻找第k位格雷码是通过哪一个格雷码得出的,以4位格雷码为例,因为第10号格雷码是由5号的前面加了“1”得到的,所以10号与5号对应   如果k小于2 n-1 ,即最高位为0,它与本身对应 按上述方法求出在n-1位格雷码中刚才算出的对应编号的值,然后在前面加上“0”或“1” 因为数据范围位2 64 ,所以要用 unsigned long long 。 代码: #include <bits/stdc++.h> #define ull unsigned long long using namespace std; int n, n1, n2, shuzu[10086]; ull k; ull mypow(int a, int b){ ull ans=1; for(int i=0; i<b; i++) ans*=a; return ans; } void digui(ull x){ if(x==0){ shuzu[0]=0; return; } else if(x==1){ shuzu[0]=1; return; } else{ if(x>=n1/2){

leetcode 89. 格雷编码

蓝咒 提交于 2019-11-26 10:56:49
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。 示例 1: 输入: 2 输出: [0,1,3,2] 解释: 00 - 0 01 - 1 11 - 3 10 - 2 对于给定的 n,其格雷编码序列并不唯一。 例如,[0,2,3,1] 也是一个有效的格雷编码序列。 00 - 0 10 - 2 11 - 3 01 - 1 示例 2: 输入: 0 输出: [0] 解释: 我们定义格雷编码序列必须以 0 开头。 给定编码总位数为 n 的格雷编码序列,其长度为 2n。当 n = 0 时,长度为 20 = 1。 因此,当 n = 0 时,其格雷编码序列为 [0]。 class Solution: def grayCode(self, n: int) -> List[int]: res = [0] i = 0 while i < n:#从2的0次方开始, res_inv = res[::-1]#求res的反向list res_inv = [x + pow(2,i) for x in res_inv] res = res + res_inv i += 1 return res 来源: https://www.cnblogs.com/xiaotongtt/p/11318383