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:  # 如果起始索引为 0
                t = 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)。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能程序员应该有什么职业素养?

人工智能程序员应该有什么职业素养&#xff1f; 面向企业需求去学习AI必备技能实战能力实战能力提升策略 面向企业需求去学习 如果想要应聘AI相关的岗位&#xff0c;就需要知道HR和管理层在招聘时需要考察些什么&#xff0c;面向招聘的需求去学习就能具备AI程序员该有的职业素…

知乎网站只让知乎用户看文章,普通人看不了

知乎默认不显示全部文章&#xff0c;需要点击展开阅读全文 然而点击后却要登录&#xff0c;这意味着普通人看不了博主写的文章&#xff0c;只有成为知乎用户才有权力查看文章。我想这不是知乎创作者希望的情况&#xff0c;他们写文章肯定是希望所有人都能看到。 这个网站篡改…

统计信号处理基础 习题解答10-9

题目 某质检员的工作是监控制造出来的电阻阻值。为此他从一批电阻中选取一个并用一个欧姆表来测量它。他知道欧姆表质量较差&#xff0c;它给测量带来了误差&#xff0c;这个误差可以看成是一个的随机变量。为此&#xff0c;质检员取N个独立的测量。另外&#xff0c;他知道阻值…

链表翻转,写法和交换类似,但是需要pre cur 还有一个临时变量nxt记录下一个结点

递归反转单链表&#xff08;头插法反转部分链表 要弄pre cur 还有nxt&#xff08;临时变量保存下一个结点 P0指到需要修改的链表的前一个结点 class Solution {public ListNode reverseBetween(ListNode head, int left, int right) {ListNode dummynew ListNode(-1,head);L…

‘AndroidStudio工具平台’尝试运行‘Android原生项目’

AndroidStudio工具平台 (内嵌Intelli IDEA集成环境) /Users/haijunyan/Library/Android/sdk 配置环境变量: #adb命令&#xff0c;安装APK查看连接设备 platform-tools #emulator命令&#xff0c;通过命令创建模拟器 tools #用NDK框架搭建的项目&#xff0c;用到下面的命令编译 …

30分钟吃掉 Pytorch 转 onnx

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

【算法小记】深度学习——时间序列数据分析 Time series Data Analysis

在本篇博客中将简单介绍常见的几种循环神经网络和一维卷积神经网络&#xff0c;并使用一些简答的数据进行拟合分析。本文相对适合刚入门的同学&#xff0c;同时也作为自己过去一段时间学习的总结和记录&#xff0c;现在神经网络框架已经非常完善的支持了很多常见和有效的深度学…

Bootstrap框架集成ECharts教程

最新公司项目要在原有的基础上增加一些饼状图和柱状图来统计一些数据给客户&#xff0c;下面就是集成的一个过程&#xff0c;还是很简单的&#xff0c;分为以下几步 1、引入ECharts的包 2、通过ECharts官网或者菜鸟教程直接拿示例代码过来修修改改直接用就可以了 注意&#xf…

Python爬虫入门与登录验证自动化思路

1、pytyon爬虫 1.1、爬虫简介 Python爬虫是使用Python编写的程序&#xff0c;可以自动访问网页并提取其中的信息。爬虫可以模拟浏览器的行为&#xff0c;自动点击链接、填写表单、进行登录等操作&#xff0c;从而获取网页中的数据。 使用Python编写爬虫的好处是&#xff0c;…

python中while循环实现九九乘法表

i 1while i < 9: # 控制行的循环j 1while j < i: # 控制每行的输出print(f"{j}*{i}{j * i}\t", end"")j 1print()i 1运行截图&#xff1a;

ARM-V9 RME(Realm Management Extension)系统架构之系统安全能力的架构差异

安全之安全(security)博客目录导读 RME系统中的应用处理单元&#xff08;PE&#xff09;之间的架构差异可能会带来潜在的安全风险并增加管理软件的复杂性。例如&#xff0c;通过在ID_AA64MMFR0_EL1.PARange中为每个PE设置不同的值来支持不同的物理范围&#xff0c;可能会妨碍内…

复数的概念

1. 虚数单位&#xff1a;i 引入一个新数 ‘i’&#xff0c;i又叫做虚数单位&#xff0c;并规定&#xff1a; 它的平方等于 -1&#xff0c;即 i -1。实数可以与它进行四则运算&#xff0c;并且原有的加&#xff0c;乘运算律依然成立。 2.定义 复数的定义&#xff1a;形如 a…

医学领域科技查新点提炼方法!---附案例分析

医学领域的查新项目研究范围较广&#xff0c;涉及基础医学、临床医学、中医学、预防医学、卫生学、特种医学等众多与人类健康和疾病有关的科学。查新目的主要包括立项、成果鉴定和报奖&#xff0c;有的期刊投稿也要求作者提供查新报告。 医学领域查新项目的两极化较明显&#…

(Proteus仿真设计)基于51单片机的电梯程序控制系统

&#xff08;Proteus仿真设计&#xff09;基于51单片机的电梯程序控制系统 一.项目介绍 本设计模拟的是一个五层的&#xff0c;各楼层间隔为4.5m的电梯程序控制系统&#xff0c;能够完成各楼层乘客的接送任务。形象地说&#xff0c;就是要对不同楼层乘客的不同需求&#xff0…

【NI国产替代】产线综测仪:锂电池保护板测试仪,支持快速定制

• 精度等级01% • 支持直流电压、电流、nA 级待机电流电阻等&#xff0c;常规测试 • 支持过压、欠压、过冲、过放、过温,短路等&#xff0c;保护测试 • 通讯总线电平可编程&#xff0c;兼容多种 • 支持 SWD 或IIC 固件烧录 • 测试速度快&#xff0c;支持最多 24 通道…

WPF-UI布局

WPF布局元素有如下几个&#xff1a; Grid&#xff1a;网格。可以自定义行和列并通过行列的数量、行高和列宽来调整控件的布局。StackPanel&#xff1a;栈式面板。可将包含的元素在竖直或水平方向上排成一条直线&#xff0c;当移除一个元素后&#xff0c;后面的元素会自动向前移…

leetcode:不同的二叉树

class Solution { public:int numTrees(int n) {vector<int> dp(n1);dp[0] 1;dp[1] 1;for(int i 2;i < n;i){for(int j 1;j < i;j) // 当根节点为j时{dp[i] dp[j-1] * dp[i-j];}}return dp[n];} }; /* dp[i] i个不同的数组成的二叉搜索数的个数假设 i 5当根…

【栈】895. 最大频率栈

本文涉及知识点 栈 LeetCode895. 最大频率栈 设计一个类似堆栈的数据结构&#xff0c;将元素推入堆栈&#xff0c;并从堆栈中弹出出现频率最高的元素。 实现 FreqStack 类: FreqStack() 构造一个空的堆栈。 void push(int val) 将一个整数 val 压入栈顶。 int pop() 删除并返…

webapi跨越问题

由于浏览器存在同源策略&#xff0c;为了防止 钓鱼问题&#xff0c;浏览器直接请求才不会有跨越的问题 浏览器要求JavaScript或Cookie只能访问同域下的内容 浏览器也是一个应用程序&#xff0c;有很多限制&#xff0c;不能访问和使用电脑信息&#xff08;获取cpu、硬盘等&#…

在开源处理器架构RISC-V中发现可远程利用的中危漏洞

在RISC-V SonicBOOM处理器设计中发现中度危险的漏洞 最近&#xff0c;西北工业大学的网络空间安全学院胡伟教授团队在RISC-V SonicBOOM处理器设计中发现了一个中度危险的漏洞。这个团队的研究人员发现了一个可远程利用的漏洞&#xff0c;该漏洞存在于开源处理器架构RISC-V中。…