1734. 解码异或后的排列

news2024/11/15 12:05:01

1. 题目

1734. 解码异或后的排列

2. 解题思路

要搞明白这个题目可以先来看下它的简化版题目:1720. 解码异或后的数组

[!NOTE] 题目:
未知 整数数组 arr 由 n 个非负整数组成。
经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3] 。
给你编码后的数组 encoded 和原数组 arr 的第一个元素 first(arr[0])。
请解码返回原数组 arr 。可以证明答案存在并且是唯一的。

异或操作:两个二进制数字进行异或(^)操作的时候,相同为0不同为1

假设元素z来自于encoded中,是编码之后的内容,xy源于arr,且二者相邻。根据题目设定,显然有:x XOR y = z的关系。
那我们看看异或运算的真值表:
image.png|400
现在只知道后面两列输入y输出z,将这两个元素当成“输入”,那么原本的输入x就是“输出”:
image.png|400
总结上表规律,就是x = y XOR z
简单小结上面内容,就是:

if x XOR y = z
then x = y XOR z

这个就是解决本题的核心。
另附带1720. 解码异或后的数组的解题代码

class Solution {
    public int[] decode(int[] encoded, int first) {
        int n = encoded.length;
        int[] perm = new int[n + 1];
        perm[0] = first;
        for (int i = 1; i < perm.length; i++) {
            perm[i] = perm[i - 1] ^ encoded[i - 1];
        }
        return perm;
    }
}

[!important] 我们再来看下本题的重点:
整数数组 perm ,它是前 n 个正整数的排列,且 n 是个 奇数
这代表了什么呢?
排列就是n个自然数,从1到n随机排序。比如n=5,就是1到5这五个数的随机排列

我们抽象一下1720. 解码异或后的数组的思路,其实就是知道perm中的两个数,就能异或出encode中对应的数。本题与1720. 解码异或后的数组相差的就是不知道perm中的第一个数字,那我们只需要求出perm中的第一个数,剩下的就好办了。
我们可以用int ABCDE 来代表perm所有数字异或的结果。int BCDE 代表除了perm中第一个元素以外所有元素异或的值。
注意:AB=A^B 后面简写了!!!

  • 既然我们知道了perm = [A, B, C, D, E],那么encoded = [AB, BC, CD, DE]
  • 根据perm,我们可以得到ABCDE,根据encoded的BC和DE,我们可以得到BCDE;
  • 将ABCDE和BCDE进行异或运算,得到A,即perm的第一个元素。

然后就可以推导剩余的元素了。

3. 代码

3.1. 注意点

[!NOTE] 1、为什么ABCD = ABCD ^ i ?且for循环能到encoded.length+1
首先题目说的perm它是前 n 个正整数的排列,且是奇数,那么我们求它的所有值的异或,就遍历1到N进行异或就行。
这里的N就是encoded.length+1,比如perm=[1,2,3]encode=[1^2,2^3] 长度总比perm少1

[!NOTE] 2、BCD的值怎么求的
首先看循环截止,它是遍历了encode的所有值,而且i是从1开始的。我们来看个例子
image.png
我们要相当于要求bcde的异或结果,那其实等价于encode[1]、encode[3]异或的结果。这也是为什么循环中每次i=i+2而不是i++ ,每次跳过一个数字就能达到目的。

[!NOTE] 3、为什么perm[0] = ABCD ^ BCD
如果 A、B、C、D 都是单独的数字,并且 ABCD 和 BCD 是这四个数字的异或操作,那么我们可以这样表示:

  • ABCD = A ^ B ^ C ^ D
  • BCD = B ^ C ^ D

异或运算的特性是:若 x^x=0 和 x^0=x,所以
A = (A ^ B ^ C ^ D) ^ (B ^ C ^ D)
这样,A 的值将被保留下来,而 B、C 和 D 将抵消。
注意,异或操作是在二进制数字的前提下!

3.2. 完整代码

class Solution {
    public int[] decode(int[] encoded) {
        int n = encoded.length;
        //整个perm数组进行异或运算后的值,比如:[1,2,3,4] 那ABCD就代表1^2^3^4
        int ABCD = 0;

        //由于perm它是前 n 个正整数的排列[排列就是n个自然数,从1到n随机排序。比如n=5,就是1到5这五个数的随机排列。],且 n 是奇数。所以perm的长度为n+1
        //例如perm=[1,0,2,1]那么encode=[1(1^0),2(0^2),3(2^1)]
        for (int i = 1; i <= n + 1; i++) {
            ABCD = ABCD ^ i;
        }

        //除了perm中第一个元素以外所有元素异或的值
        int BCD = 0;
        //遍历encode
        for (int i = 1; i < n; i = i + 2) {
            BCD = BCD ^ encoded[i];
        }
        int[] perm = new int[n + 1];
        perm[0] = ABCD ^ BCD;
        for (int i = 1; i < perm.length; i++) {
            perm[i] = perm[i - 1] ^ encoded[i - 1];
        }
        return perm;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2147199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES6标准---【八】【学习ES6看这一篇就够了!!!】

目录 前言 export命令 输出变量 输出函数/类 export中的as别名 export必须一一对应 export接口的响应性 注意 import命令 import命令的语法 import命令里的as别名 import的只读性 import命令具有提升性 import的一些约定 import的静态执行 import的唯一执行性 模…

windows查找端口号被占用

在很多开发的时候&#xff0c;可能端口号有被占用的情况&#xff0c;导致项目打不开。 用下面这个命令即可&#xff1a; 比如我的3000端口被占用&#xff0c;我找找哪个进程在占用我的3000端口号

SVM原理

SVM 这里由于过了很长时间 博主当时因为兴趣了解了下 博主现在把以前的知识放到博客上 作为以前的学习的一个结束 这些东西来自其他资料上 小伙伴看不懂英文的自行去翻译下吧 博主就偷个懒了 多维空间和低维空间 不一样的分法&#xff0c;将数据映射到高维 &…

【电路笔记】-运算放大器比较器

运算放大器比较器 文章目录 运算放大器比较器1、概述2、表示2.1 同相比较器2.2 反相比较器3、临界点转换4、施密特触发器4.1 同相触发器4.2 反相触发器4.3 应用5、总结1、概述 在前面的大多数运算放大器文章中,电路都有一个到反相输入的反馈环路。 这种设计是最常见的,因为它…

汇总区间计算

给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b] 应该按…

感知笔记:ROS 视觉- 跟随红球

- 目录 - 如何在 ROS 中可视化 RGB 相机。如何作为机器人切换主题。如何创建 blob 检测器。如何获取要跟踪的颜色的颜色编码。如何使用 blob 检测数据并移动 RGB 相机以跟踪 blob。 机器人技术中最常见的传感器是不起眼的 RGB 摄像头。它用于从基本颜色跟踪&#xff08;blob 跟…

Vue2接入高德地图API实现搜索定位和点击获取经纬度及地址功能

目录 一、申请密钥 二、安装element-ui 三、安装高德地图依赖 四、完整代码 五、运行截图 一、申请密钥 登录高德开放平台&#xff0c;点击我的应用&#xff0c;先添加新应用&#xff0c;然后再添加Key。 如图所示填写对应的信息&#xff0c;系统就会自动生成。 二、安装…

python-奖金/贪心的小明

一&#xff1a;奖金 题目描述 企业发放的奖金根据利润提成。利润低于或等于 100000 元的&#xff0c;奖金可提 10%&#xff1b; 利润高于 100000 元&#xff0c;低于 200000 元&#xff08; 100000<I≤200000&#xff09;时&#xff0c;低于 100000 元的部分按 10% 提成&…

二叉树的链式结构和递归程序的递归流程图

二叉树的链式存储结构是指&#xff0c;用链表来表示一棵二叉树&#xff0c;即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成&#xff0c;数据域和左右指针域&#xff0c;左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分…

一个基于VB的期刊信息管理系统

一个基本的期刊信息管理系统的示例&#xff0c;使用 Visual Basic (VB.NET) 编写。这个示例将展示如何创建一个简单的期刊信息管理系统&#xff0c;其中包括添加、查看、编辑和删除期刊的功能。 系统需求 添加期刊&#xff1a;允许用户输入期刊的信息&#xff08;如标题、作者…

面试官问:你如何处理与同事或上级的分歧?【无标题】

面试官问&#xff1a;你如何处理与同事或上级的分歧&#xff1f; 当面试官问你如何处理与同事或上级的分歧&#xff0c;其实面试官的目的是评估你的沟通技巧、冲突解决能力和团队合作的能力。在一起共事&#xff0c;就一定有分歧发生&#xff0c;有争执是正常的&#xff0c;关…

OpenCV 1

前言&#xff1a;开新坑辽&#xff0c;&#xff0c; 目录 计算机眼中的图像 视频的读取与处理 ROI区域 边界填充 数值计算 腐蚀操作 膨胀操作 开运算与闭运算 梯度计算 礼貌与黑帽 Sobel算子 梯度计算方法 scharr与laplacian 计算机眼中的图像 灰色图片&#xff0…

ROS第四梯:ROS项目中添加自定义类

第一步&#xff0c;ROS项目结构介绍 工作空间中包含一个名为pcl_ros_test的功能包&#xff0c;其中main.cpp是原有项目自带的&#xff0c;接下来以CommonAlg自定义类添加为例进行介绍。 第二步&#xff1a;头文件CommonAlg.h创建和编写&#xff0c;并保存在include/pcl_ros_tes…

达梦数据库导入xml迁移到达梦数据库大文件导致中断问题解决方案记录?

问题&#xff1a;我将同事给我的xml文件迁移到盗梦数据库&#xff0c;xml文件大约2G&#xff0c;在导入过程中&#xff0c;总是导入一半都不到就失败了。 原因&#xff1a;我的原因是我的电脑的系统的运行内存是16G的&#xff0c;后来我发现在没导入之前&#xff0c;其他进程已…

GUI编程18:文本框、密码框、文本域

视频链接&#xff1a;20、文本框、密码框、文本域_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p20&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.文本框 示例代码&#xff1a; package com.yundait.lesson06;import javax.swing.*; import java.a…

初始分布式系统和Redis特点(

&#xff08;一&#xff09;认识redis Redis是一个开源&#xff08;BSD许可&#xff09;&#xff0c;内存存储的数据结构服务器&#xff0c;可用作数据库&#xff0c;高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合&#xff0c;位图&#xff0c;hyperlog…

『功能项目』QFrameWorkBug修改器界面【65】

我们打开上一篇64QFrameWork道具栏物品生成的项目&#xff0c; 本章要做的事情是做一个道具bug调试面板&#xff0c;可以增加主角属性&#xff0c;可以增加道具的功能 首先创建一个空物体&#xff08;钉子&#xff09; 按住Alt键将空物体钉到左侧 重命名为Left 创建Button、Im…

基于SpringBoot+Vue的企业会议室预定管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

Qt实战案例(60)——利用QTimer类实现实时时间功能

目录 一、项目介绍二、项目基本配置三、UI界面设置四、主程序实现4.1 widget.h头文件4.2 widget.cpp源文件 五、效果演示 一、项目介绍 本文介绍利用QTimer类实现实时时间功能并在状态栏中进行显示。 二、项目基本配置 新建一个Qt案例&#xff0c;项目名称为“TimeTest”&am…

阿里通义千问开源Qwen2.5系列模型:Qwen2-VL-72B媲美GPT-4

通义千问团队近日重磅宣布&#xff0c;继其Qwen2模型发布仅三个月后&#xff0c;再次推出Qwen家族的全新成员——Qwen2.5系列语言模型&#xff0c;并已全面开源。这次开源行动堪称史上规模之最&#xff0c;涵盖了通用型Qwen2.5&#xff0c;以及专为编程和数学领域打造的Qwen2.5…