1310. 子数组异或查询 异或 前缀和 python

有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] = [Li, Ri]

对于每个查询 i,请你计算从 Li 到 Ri 的 XOR 值(即 arr[Li] xor arr[Li+1] xor ... xor arr[Ri])作为本次查询的结果。

并返回一个包含给定查询 queries 所有结果的数组。

示例 1:

输入:arr = [1,3,4,8], queries = [[0,1],[1,2],[0,3],[3,3]]
输出:[2,7,14,8] 
解释:
数组中元素的二进制表示形式是:
1 = 0001 
3 = 0011 
4 = 0100 
8 = 1000 
查询的 XOR 值为:
[0,1] = 1 xor 3 = 2 
[1,2] = 3 xor 4 = 7 
[0,3] = 1 xor 3 xor 4 xor 8 = 14 
[3,3] = 8

示例 2:

输入:arr = [4,8,2,10], queries = [[2,3],[1,3],[0,0],[0,3]]
输出:[8,0,4,4]

提示:

  • 1 <= arr.length <= 3 * 10^4
  • 1 <= arr[i] <= 10^9
  • 1 <= queries.length <= 3 * 10^4
  • queries[i].length == 2
  • 0 <= queries[i][0] <= queries[i][1] < arr.length

涉及到的知识点:

前缀和   

异或的两个基本性质,a^a=0,a^0=a

思路:

 1. 首先计算数组 `arr` 的前缀异或值并存储在 `pre` 数组中,通过遍历数组依次计算每个位置的前缀异或。 2. 然后对于每个查询 `queries` 中的一对起始索引和结束索引: - 如果起始索引为 `0`,则直接将结束索引对应位置的前缀异或值作为结果。 - 如果起始索引不为 `0`,则通过结束索引处的前缀异或值与起始索引减 `1` 处的前缀异或值进行异或运算,得到该查询区间的异或结果。 3. 将每次计算得到的结果添加到 `ans` 数组中,最后返回 `ans` 数组,即所有查询的结果。 总体来说,利用前缀异或的特性高效地处理了对数组不同区间进行异或计算的问题。

前缀和运算

前缀异或运算是一种对数组进行的运算,它的结果是一个新的数组,其中每个元素都是原数组对应位置之前的所有元素的异或值。 具体来说,假设原数组为$a_1,a_2,a_3,,那么前缀异或运算的结果数组$b_1,b_2,b_3,满足以下条件:

。 前缀异或运算的主要作用是方便地计算数组的某些子段的异或值。通过前缀异或运算,可以在O(1)的时间复杂度内计算出任意子段的异或值,而不需要重新对该子段进行异或运算。 例如,对于数组a_1,a_2,a_3,a_4,a_5,a_6,其前缀异或数组为b_1,b_2,b_3,b_4,b_5,b_6。如果要计算子段a_3,a_4,a_5的异或值,可以通过$b_5\oplus b_2$来得到,因为b_5是a_1\oplus a_2\oplus a_3\oplus a_4\oplus a_5的异或值,b_2是a_1\oplus a_2的异或值,所以b_5\oplus b_2就是a_3\oplus a_4\oplus a_5的异或值。 前缀异或运算在一些算法和数据结构中经常被使用,例如在解决异或相关的问题、快速计算子段异或值等方面都有应用。

代码如下

class Solution(object):def xorQueries(self, arr, queries):""":type arr: List[int]:type queries: List[List[int]]:rtype: List[int]"""n = len(arr)  # 获取数组长度pre = [0] * n  # 初始化前缀异或结果数组pre[0] = arr[0]  # 第一个元素的前缀异或就是它本身for i in range(1, n):  # 从第二个元素开始计算前缀异或pre[i] = pre[i - 1] ^ arr[i]print("pre=", pre)  # 打印前缀异或结果ans = []  # 用于存储最终结果的列表for i in queries:  # 遍历查询列表if i[0] == 0:  # 如果起始索引为 0t = pre[i[1]]  # 直接取对应位置的前缀异或结果else:t = pre[i[1]] ^ pre[i[0] - 1]  # 否则计算两个前缀异或结果的异或# print(f"i[1]={i[1]},i[0]={i[0]}")# print(f"pre[i[1]]={pre[i[1]]} ,pre[i[0]]={pre[i[0]]}")ans.append(t)  # 将计算结果添加到结果列表return ans  # 返回最终结果列表

时间复杂度:

  • 计算前缀异或的过程需要遍历数组一次,时间复杂度为 O(n)。
  • 对于每个查询,计算结果的操作时间复杂度为 O(1),因为只涉及到常数次基本运算。而查询的数量为 m(假设 queries 的长度为 m),所以处理所有查询的总时间复杂度为 O(m)。综合起来,总的时间复杂度为 O(n + m)。

空间复杂度:

  • 需要额外创建一个长度为 n 的前缀异或数组 pre,所以空间复杂度为 O(n)。

 

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

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

相关文章

《精通ChatGPT:从入门到大师的Prompt指南》附录B:推荐阅读资源

作者&#xff1a;斯图尔特拉塞尔 (Stuart Russell) 和 彼得诺维格 (Peter Norvig) 简介&#xff1a;这本书被誉为人工智能领域的经典教材&#xff0c;内容涵盖了AI的基本原理、算法及其应用。无论是入门者还是专业研究者&#xff0c;都能从中获得启发。 2. 《深度学习》 作者…

【目标跟踪网络训练 Market-1501 数据集】DeepSort 训练自己的跟踪网络模型

前言 Deepsort之所以可以大量避免IDSwitch&#xff0c;是因为Deepsort算法中特征提取网络可以将目标检测框中的特征提取出来并保存&#xff0c;在目标被遮挡后又从新出现后&#xff0c;利用前后的特征对比可以将遮挡的后又出现的目标和遮挡之前的追踪的目标重新找到&#xff0…

企业网页制作

随着互联网的普及&#xff0c;企业网站已成为企业展示自己形象、吸引潜在客户、开拓新市场的重要方式。而企业网页制作则是构建企业网站的基础工作&#xff0c;它的质量和效率对于企业网站的成败至关重要。 首先&#xff0c;企业网页制作需要根据企业的特点和需求进行规划。在网…

前端 移动端 手机调试 (超简单,超有效 !)

背景&#xff1a;webpack工具构建下的vue项目 1. 找出电脑的ipv4地址 2. 替换 host 3. 手机连接电脑热点或者同一个wifi 。浏览器打开链接即可。

Spring运维之业务层测试数据回滚以及设置测试的随机用例

业务层测试数据回滚 我们之前在写dao层 测试的时候 如果执行到这边的代码 会在数据库 里面留下数据 运行一次留一次数据 开发有开发数据库&#xff0c;运行有运行数据库 我们先连数据库 在pom文件里引入mysql的驱动和mybatis-plus的依赖 在数据层写接口 用mybatis-plus进…

openh264 场景变化检测算法源码分析

文件位置 openh264/codec/processing/scenechangedetection/SceneChangeDetection.cppopenh264/codec/processing/scenechangedetection/SceneChangeDetection.h 代码流程 说明&#xff1a; 通过代码流程分析&#xff0c;当METHOD_SCENE_CHANGE_DETECTION_SCREEN场景类型为时…

Linux -- 了解 vim

目录 vim Linux 怎么编写代码&#xff1f; 了解 vim 的模式 什么是命令模式&#xff1f; 命令模式下 vim 的快捷键&#xff1a; 光标定位&#xff1a; 复制粘贴&#xff1a; 删除及撤销&#xff1a; 注释代码&#xff1a; 什么是底行模式&#xff1f; ​编辑 ​编辑…

Java:111-SpringMVC的底层原理(中篇)

这里续写上一章博客&#xff08;110章博客&#xff09;&#xff1a; 现在我们来学习一下高级的技术&#xff0c;前面的mvc知识&#xff0c;我们基本可以在67章博客及其后面相关的博客可以学习到&#xff0c;现在开始学习精髓&#xff1a; Spring MVC 高级技术&#xff1a; …

Large-Scale LiDAR Consistent Mapping usingHierarchical LiDAR Bundle Adjustment

1. 代码地址 GitHub - hku-mars/HBA: [RAL 2023] A globally consistent LiDAR map optimization module 2. 摘要 重建精确一致的大规模激光雷达点云地图对于机器人应用至关重要。现有的基于位姿图优化的解决方案&#xff0c;尽管它在时间方面是有效的&#xff0c;但不能直接…

ubuntu使用docker安装openwrt

系统&#xff1a;ubuntu24.04 架构&#xff1a;x86 1. 安装docker 1.1 离线安装 docker下载地址 根据系统版本&#xff0c;依次下载最新的三个关于docker的软件包 container.io&#xff08;注意后缀版本顺序&#xff09;docker-ce-clidocker-ce 然后再ubuntu系统中依次按顺…

【召回第一篇】召回方法综述

各个网站上找的各位大神的优秀回答&#xff0c;记录再此。 首先是石塔西大佬的回答&#xff1a;工业界推荐系统中有哪些召回策略&#xff1f; 万变不离其宗&#xff1a;用统一框架理解向量化召回前言常读我的文章的同学会注意到&#xff0c;我一直强调、推崇&#xff0c;不要…

多种策略提升线上 tensorflow 模型推理速度

前言 本文以最常见的模型 Bi-LSTM-CRF 为例&#xff0c;总结了在实际工作中能有效提升在 CPU/GPU 上的推理速度的若干方法&#xff0c;包括优化模型结构&#xff0c;优化超参数&#xff0c;使用 onnx 框架等。当然如果你有充足的 GPU &#xff0c;结合以上方法提升推理速度的效…

真空衰变,真正的宇宙级灾难,它到底有多可怕?

真空衰变&#xff0c;真正的宇宙级灾难&#xff0c;它到底有多可怕&#xff1f; 真空衰变 真空衰变&#xff08;Vacuum decay&#xff09;是物理学家根据量子场论推测出的一种宇宙中可能会发生的现象&#xff0c;这种现象被称为真正的宇宙级灾难&#xff0c;它到底有多可怕呢…

前端 Vue 操作文件方法(导出下载、图片压缩、文件上传和转换)

一、前言 本文对前端 Vue 项目开发过程中&#xff0c;经常遇到要对文件做一些相关操作&#xff0c;比如&#xff1a;文件导出下载、文件上传、图片压缩、文件转换等一些处理方法进行归纳整理&#xff0c;方便后续查阅和复用。 二、具体内容 1、后端的文件导出接口&#xff0c;…

【报文数据流中的反压处理】

报文数据流中的反压处理 1 带存储体的反压1.1 原理图1.2 Demo 尤其是在NP芯片中&#xff0c;经常涉及到报文的数据流处理&#xff1b;为了防止数据丢失&#xff0c;和各模块的流水处理&#xff1b;因此需要到反压机制&#xff1b; 反压机制目前接触到的有两种&#xff1a;一是基…

【深度学习】目标检测,Faster-RCNN算法训练,使用mmdetection训练

文章目录 资料环境数据测试 资料 https://mmdetection.readthedocs.io/zh-cn/latest/user_guides/config.html 环境 Dockerfile ARG PYTORCH"1.9.0" ARG CUDA"11.1" ARG CUDNN"8"FROM pytorch/pytorch:${PYTORCH}-cuda${CUDA}-cudnn${CUDNN}…

使用 Scapy 库编写 TCP 劫持攻击脚本

一、介绍 TCP劫持攻击&#xff08;TCP Hijacking&#xff09;&#xff0c;也称为会话劫持&#xff0c;是一种攻击方式&#xff0c;攻击者在合法用户与服务器之间的通信过程中插入或劫持数据包&#xff0c;从而控制通信会话。通过TCP劫持&#xff0c;攻击者可以获取敏感信息、执…

mysql 更改数据存储目录

先停止 mysql &#xff1a;sudo systemctl start/stop mysql 新建新的目录&#xff0c; 比如 /mnt/data/systemdata/mysql/mysql_data sudo chown -R mysql:mysql /mnt/data/sysdata/mysql/mysql_data sudo chmod -R 750 /mnt/data/sysdata/mysql/mysql_data 更改mysql.cnf…

2024高考作文-ChatGPT完成答卷,邀请大家来打分

高考&#xff0c;愿你脑洞大开&#xff0c;知识点全都扎根脑海&#xff1b;考试时手感倍儿棒&#xff0c;答题如行云流水&#xff1b;成绩公布时&#xff0c;笑容如春风拂面&#xff0c;心情如阳光普照&#xff01;高考加油&#xff0c;你一定行&#xff01; 新课标I卷 试题内…

“深入探讨Java中的对象拷贝:浅拷贝与深拷贝的差异与应用“

前言&#xff1a;在Java编程中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;与浅拷贝&#xff08;Shallow Copy&#xff09;是两个非常重要的概念。它们涉及到对象在内存中的复制方式&#xff0c;对于理解对象的引用、内存管理以及数据安全都至关重要。 ✨✨✨这里是秋…