当前位置: 首页 > news >正文

LeetCode题解:1238. 循环码排列,归纳法,详细注释

原题链接:
https://leetcode.cn/problems/circular-permutation-in-binary-representation/

前置条件:

  1. 在解题之前,请先一定要阅读89.格雷编码的题解
  2. 格雷编码可以满足题目的条件“p[i]p[i+1] 的二进制表示形式只有一位不同”,以及“p[0]p[2^n -1] 的二进制表示形式也只有一位不同”
  3. 我们需要将格雷编码转换成以start开头的一串编码即可
  4. 为何要用异或:
    • 格雷编码的第一个是0,可以得知0 ^ start = start
    • 回顾一下异或操作,可以知道如果对每一位都进行异或操作,每一位之间的逻辑关系的变化是同步的
    • 也就是说,p[i]p[i+1]的相互关系,以及p[0]p[2^n -1] 的相互关系不会改变
      a | b | a XOR b
      —|—|---------
      0 | 0 | 0
      0 | 1 | 1
      1 | 0 | 1
      1 | 1 | 0

解法一:两次循环:

  1. 按照89.格雷编码的方法求出格雷编码
  2. 将格雷编码的每一位都按位异或start,即可求得结果
/*** @param {number} n* @param {number} start* @return {number[]}*/
var circularPermutation = function (n, start) {/* * 第一步,先求格雷编码*/let result = [0] // 存储结果,第一个整数为0// 一共计算n位格雷码序列,需要循环n次for (let i = 0; i < n; i++) {// 每次计算时,已有的序列不变// 只需要计算已有序列的逆序列,每个再加前缀1// 需要缓存已有序列的长度,用于计算下一段序列const len = result.length// 由于是逆序计算,因此要从len - 1开始加前缀for (let j = len - 1; j >= 0; j--) {// 加前缀1后,把新值存入结果result.push(result[j] | (1 << i))}}/* * 第二步,将格雷编码的每一项都按位异或start*/for (let i = 0; i < result.length; i++) {result[i] ^= start}return result
}

解法二:

  1. 可以在解法一的基础上,将第二步的异或操作,放到第一步的第二层循环中,具体方法如下:
    • 每次查找result中的元素时,将其异或start,将其转为格雷编码
    • 给格雷编码加上前缀1
    • 存入result时,将其异或start,转为以start开头的编码
/*** @param {number} n* @param {number} start* @return {number[]}*/
var circularPermutation = function (n, start) {let result = [start] // // 存储结果,第一个整数为start// 一共计算n位编码,需要循环n次for (let i = 0; i < n; i++) {// 每次计算时,已有的序列不变// 只需要计算已有序列的逆序列,每个再加前缀1// 需要缓存已有序列的长度,用于计算下一段序列const len = result.length// 由于是逆序计算,因此要从len - 1开始加前缀for (let j = len - 1; j >= 0; j--) {// 加前缀1后,把新值存入结果result.push(// 将编码异或start,转为格雷编码((result[j] ^ start) |// 为格雷编码加上前缀1(1 << i)) ^// 将格雷编码异或start,转为以start开头的编码start)}}return result
}
http://www.lryc.cn/news/22458.html

相关文章:

  • 全新后门文件Nev-3.exe分析
  • 线性回归系数解释
  • 22.2.27打卡 Codeforces Round #852 (Div. 2) A~D
  • 如何查看Spring Boot各版本的变化
  • 程序员是否要加入创业公司?
  • 2023软件测试工程师全新技术栈,吃透这些,起薪就是25k~
  • 【ChatGPT情商大考验】ChatGPT教我谈恋爱
  • C++类内存结构模型
  • HTML#4超链接标签,列表标签,表格标签和布局标签
  • 本科课程【数字图像处理】实验汇总
  • nginx安装lua、jwt模块,通过lua验证jwt实现蓝绿发布样例
  • 【redis的几种数据结构及在Java里的应用案例】
  • 【mybatis】 01- mybatis快速入门
  • 【C语言每日一题】杨氏矩阵(源码以及改进源码)
  • JavaScript 面向对象【快速掌握知识点】
  • Qt——自定义Model
  • 用 .NET 启动你的 DJI Ryze Tello 无人机
  • sed 功能详解
  • 整数二分思路详解
  • 基于java的进销库存管理系统(Vue+Springboot+Mysql)前后端分离项目,附万字课设论文
  • 手动添加 Grub 启动项
  • 工人搬砖-课后程序(JAVA基础案例教程-黑马程序员编著-第八章-课后作业)
  • 深度学习中backbone、head、neck等概念
  • 华为OD机试用Python实现 -【Linux 发行版的数量】(2023-Q1 新题)
  • Http报文解析
  • Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目
  • TIA博途Wincc中自定义配方画面的具体方法示例
  • Java反射系列--方法大全
  • LeetCode 169. 多数元素
  • 来了,metaIPC1.0