博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LintCode] Gray Code 格雷码
阅读量:6801 次
发布时间:2019-06-26

本文共 3417 字,大约阅读时间需要 11 分钟。

 

The gray code is a binary numeral system where two successive values differ in only one bit.

Given a non-negative integer n representing the total number of bits in the code, find the sequence of gray code. A gray code sequence must begin with 0 and with cover all 2nintegers.

 Notice

For a given n, a gray code sequence is not uniquely defined.

[0,2,3,1] is also a valid gray code sequence according to the above definition.

Example

Given n = 2, return [0,1,3,2]. Its gray code sequence is:

00 - 001 - 111 - 310 - 2

O(2n) time.

 

LeetCode上的原题,请参见我之前的博客。

 

解法一:

class Solution {public:    /**     * @param n a number     * @return Gray code     */    vector
grayCode(int n) { vector
res; for (int i = 0; i < pow(2, n); ++i) { res.push_back((i >> 1) ^ i); } return res; }};

 

解法二:

class Solution {public:    /**     * @param n a number     * @return Gray code     */    vector
grayCode(int n) { vector
res{
0}; for (int i = 0; i < n; ++i) { int size = res.size(); for (int j = size - 1; j >= 0; --j) { res.push_back(res[j] | (1 << i)); } } return res; }};

 

解法三:

class Solution {public:    /**     * @param n a number     * @return Gray code     */    vector
grayCode(int n) { vector
res{
0}; int len = pow(2, n); for (int i = 1; i < len; ++i) { int pre = res.back(); if (i % 2 == 1) { pre = (pre & (len - 2)) | (~pre & 1); } else { int cnt = 1, t = pre; while ((t & 1) != 1) { ++cnt; t >>= 1; } if ((pre & (1 << cnt)) == 0) pre |= (1 << cnt); else pre &= ~(1 << cnt); } res.push_back(pre); } return res; }};

 

解法四:

class Solution {public:    /**     * @param n a number     * @return Gray code     */    vector
grayCode(int n) { vector
res{
0}; unordered_set
s; stack
st; s.insert(0); st.push(0); while (!st.empty()) { int t = st.top(); st.pop(); for (int i = 0; i < n; ++i) { int k = t; if ((k & (1 << i)) == 0) k |= (1 << i); else k &= ~(1 << i); if (s.count(k)) continue; s.insert(k); st.push(k); res.push_back(k); break; } } return res; }};

 

解法五:

class Solution {public:    /**     * @param n a number     * @return Gray code     */    vector
grayCode(int n) { vector
res; unordered_set
s; helper(n, s, 0, res); return res; } void helper(int n, set
& s, int out, vector
& res) { if (!s.count(out)) { s.insert(out); res.push_back(out); } for (int i = 0; i < n; ++i) { int t = out; if ((t & (1 << i)) == 0) t |= (1 << i); else t &= ~(1 << i); if (s.count(t)) continue; helper(n, s, t, res); break; } }};

 

转载地址:http://skywl.baihongyu.com/

你可能感兴趣的文章
BCH或许才是真正的未来
查看>>
python编程:从入门到实践学习笔记-函数
查看>>
SpringBoot使用Nacos配置中心
查看>>
Java四种线程池的使用
查看>>
Go学习系列——第一个 Go程序
查看>>
关于ntp时间同步理论及配置参数-20170804
查看>>
loadrunner 脚本开发-int型变量和字符串的相互转换
查看>>
为什么运行NOVA命令总要报一个DEBUG,没找到原因,路过的大侠一起看看啊
查看>>
北电ERS1600,8300,8600交换机的基本技术-第十章接口高级特征
查看>>
我的友情链接
查看>>
20170830L08-06老男孩linux实战运维培训-Lamp系列之-Apache服务生产实战应用指南03
查看>>
我的友情链接
查看>>
今天面试IBM CSDL
查看>>
React+Node.js+Express+mongoskin+MongoDB
查看>>
【深入浅出MyBatis系列九】改造Cache插件
查看>>
Centos6.3 路由模式配置Open×××服务器
查看>>
CentOS6.x下自动安装本地和网络YUM源
查看>>
mysql基础知识之增删查改使用介绍
查看>>
C++11 提升Vector效能的技巧
查看>>
Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.
查看>>