leedcode每日一题——1.8

目录

格雷编码

  • 题目介绍
    在这里插入图片描述

  • 思路分析

    1. 对于本题而言,我们可以利用数学归纳的思想,假设k位格雷码序列我们是已知的,则k+1位格雷码序列是什么样子的?
    2. 当我们把k位格雷码序列翻转过来衔接到原来的k位格雷码序列之后时,前边的2的k次幂位和后面2的k次幂位都是符合条件的,这时我们需要处理的是衔接处的两个数字如何处理。
    3. 根据题目要求,我们可以对后半部分的格雷码序列分别追加1,这样衔接处的两个数字也满足了题目要求且不影响后面的格雷码序列,因为都追加了1。这里具体解释一下:追加1的意思是对某个数字的二进制追加1而不是直接对某个数字加1,举个例子:对2追加1,2的二进制为10,追加1变为110对应的数字为6;4的二进制为100,追加1变为1100对应的数字为12。
    4. 在位运算中对一个数字k追加1的具体表示方法为:k|1<<i,(i为k的二进制的最高位+1),1<<i的意思为2的i次幂。
  • 相关代码片段

class Solution {
   public List<Integer> grayCode(int n) {
       List<Integer> list = new ArrayList<>();
       //格雷码的第一位一定为0
       list.add(0);
       for(int i = 1; i <= n;i++){
           int m = list.size();
           //先翻转然后在对翻转后的格雷码序列追加1
           for(int j = m-1; j >= 0; j--){
               list.add(list.get(j)|1<<(i-1));
           }
       }
       return list;
}
}
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

囚蕤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值