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

简介: 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)。
相关文章
|
2月前
|
关系型数据库 数据库连接 数据库
Python执行PG数据库查询语句:以Markdown格式打印查询结果
使用Python的`psycopg2`和`pandas`库与PostgreSQL交互,执行查询并以Markdown格式打印结果。首先确保安装所需库:`pip install psycopg2 pandas`。接着建立数据库连接,执行查询,将查询结果转换为DataFrame,再用`tabulate`库将DataFrame格式化为Markdown。代码示例包括连接函数、查询函数、转换和打印函数。最后限制列宽以适应输出。
|
3月前
|
数据采集 JSON 数据挖掘
2024年利用Python查询IP地址_怎么查python文件中ip地址,2024年最新15个经典面试问题及答案英语
2024年利用Python查询IP地址_怎么查python文件中ip地址,2024年最新15个经典面试问题及答案英语
|
3天前
|
运维 网络架构 Python
利用Python查询H3C网络设备示例,运维用了它,都称赞!
利用Python查询H3C网络设备示例,运维用了它,都称赞!
|
2月前
|
SQL 关系型数据库 数据库
Python执行PostgreSQL数据库查询语句,并打印查询结果
本文介绍了如何使用Python连接和查询PostgreSQL数据库。首先,确保安装了`psycopg2`库,然后创建数据库连接函数。接着,展示如何编写SQL查询并执行,例如从`employees`表中选取所有记录。此外,还讨论了处理查询结果、格式化输出和异常处理的方法。最后,提到了参数化查询和事务处理以增强安全性及确保数据一致性。
Python执行PostgreSQL数据库查询语句,并打印查询结果
|
2月前
|
Python
如何查询Python包的所有历史版本
如何查询Python包的所有历史版本
95 5
|
30天前
|
存储 Python
深度剖析:Python里字典树Trie的构建与查询,让你的代码更优雅!
【7月更文挑战第20天】Trie树(前缀树)是高效处理字符串搜索的 数据结构**。通过Python实现,每个节点含指向子节点的链接(字典)和结束标识。`TrieNode`和`Trie`类分别表示节点和树,支持插入、搜索和前缀检查。空间效率高,共享公共前缀,时间复杂度O(m)。适用于字符串集合的快速检索和灵活扩展,如自动补全。学习和应用Trie能提升代码效率和质量。
16 0
|
2月前
|
SQL 关系型数据库 数据库
Python查询PostgreSQL数据库
木头左教你如何用Python连接PostgreSQL数据库:安装`psycopg2`库,建立连接,执行SQL脚本如创建表、插入数据,同时掌握错误处理和事务管理。别忘了性能优化,利用索引、批量操作提升效率。下期更精彩!💡 csvfile
Python查询PostgreSQL数据库
|
2月前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之对于Hologres的Python查询,该如何操作
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
27 0
|
2月前
|
前端开发 数据库 Python
Python Django项目下的分页和筛选查询
在Django中实现分页功能,视图函数通过`Paginator`处理数据,每页显示10条记录。URL配置支持带参数和不带参数的分页请求。前端模板使用for循环展示分页数据,包括商品信息和状态按钮,并利用分页组件导航。筛选查询视图根据GET请求的`state`参数过滤上架或下架产品,同样实现分页功能。前端添加状态选择下拉框,分页链接携带查询参数`state`确保筛选状态在翻页时保持。
|
7天前
|
算法 程序员 开发工具
百万级Python讲师又一力作!Python编程轻松进阶,豆瓣评分8.1
在学习Python的旅程中你是否正在“绝望的沙漠”里徘徊? 学完基础教程的你,是否还在为选择什么学习资料犹豫不决,不知从何入手,提高自己?
百万级Python讲师又一力作!Python编程轻松进阶,豆瓣评分8.1