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)。
相关文章
|
1月前
|
数据采集 人工智能 自然语言处理
Python实时查询股票API的FinanceAgent框架构建股票(美股/A股/港股)AI Agent
金融领域Finance AI Agents方面的工作,发现很多行业需求和用户输入的 query都是和查询股价/行情/指数/财报汇总/金融理财建议相关。如果需要准确的 金融实时数据就不能只依赖LLM 来生成了。常规的方案包括 RAG (包括调用API )再把对应数据和prompt 一起拼接送给大模型来做文本生成。稳定的一些商业机构的金融数据API基本都是收费的,如果是以科研和demo性质有一些开放爬虫API可以使用。这里主要介绍一下 FinanceAgent,github地址 https://github.com/AI-Hub-Admin/FinanceAgent
|
14天前
|
测试技术 API 数据安全/隐私保护
Python连接到Jira实例、登录、查询、修改和创建bug
通过使用Python和Jira的REST API,可以方便地连接到Jira实例并进行各种操作,包括查询、修改和创建Bug。`jira`库提供了简洁的接口,使得这些操作变得简单易行。无论是自动化测试还是开发工作流的集成,这些方法都可以极大地提高效率和准确性。希望通过本文的介绍,您能够更好地理解和应用这些技术。
54 0
|
1月前
|
iOS开发 MacOS Python
Python编程小案例—利用flask查询本机IP归属并输出网页图片
Python编程小案例—利用flask查询本机IP归属并输出网页图片
|
2月前
|
关系型数据库 MySQL 数据库
Python MySQL查询返回字典类型数据的方法
通过使用 `mysql-connector-python`库并选择 `MySQLCursorDict`作为游标类型,您可以轻松地将MySQL查询结果以字典类型返回。这种方式提高了代码的可读性,使得数据操作更加直观和方便。上述步骤和示例代码展示了如何实现这一功能,希望对您的项目开发有所帮助。
125 4
|
2月前
|
存储 Python
深度剖析:Python里字典树Trie的构建与查询,让你的代码更优雅!
在编程的世界里,数据结构的选择往往直接决定了程序的效率和可读性。今天,我们将深入探索一种高效处理字符串搜索与匹配的数据结构——字典树(Trie),也称作前缀树或单词查找树。通过Python实现Trie树,我们将看到它如何优雅地解决一系列字符串相关的问题,并提升代码的整体质量。
41 2
|
1月前
|
SQL 前端开发 Python
基于python-django的neo4j人民的名义关系图谱查询系统
基于python-django的neo4j人民的名义关系图谱查询系统
32 0
|
1月前
|
IDE 搜索推荐 网络安全
Python编程:编写被动信息搜集之网址的IP及Whois查询
Python编程:编写被动信息搜集之网址的IP及Whois查询
|
3月前
|
测试技术 API 开发者
Python 魔法:打造你的第一个天气查询小工具自动化测试框架的构建与实践
【8月更文挑战第31天】在这篇文章中,我们将一起踏上编程的奇妙旅程。想象一下,只需几行代码,就能让计算机告诉你明天是否要带伞。是的,你没有听错,我们将用Python这把钥匙,解锁天气预报的秘密。不论你是编程新手还是想拓展技能的老手,这篇文章都会为你带来新的视角和灵感。所以,拿起你的键盘,让我们一起创造属于自己的天气小工具吧!
|
2月前
|
数据采集 自然语言处理 数据挖掘
python查询汉字函数
简洁、高效、易懂的代码对于提高开发效率与项目质量至关重要,并且对于维持代码的可读性和可维护性也有着很大帮助。选择正确的工具和方法可以大幅提升处理中文数据的效率。在编写用户定义函数时,明确函数的功能与返回值类型对于函数的复用和调试也同样重要。当涉及到复杂的文本处理或数据分析时,不宜过分依赖单一的工具或方法,而应根据具体需求灵活选择和组合不同的技术手段。
36 0
|
3月前
|
搜索推荐 API 数据处理
Python魔法:打造个性化天气查询工具
【8月更文挑战第31天】 在这篇文章中,我们将一起探索如何用Python构建一个个性化的天气查询工具。不同于传统的技术文章,我们将通过一个简单的故事引入主题,让读者感受到编程的乐趣和实用性。文章将介绍如何使用API获取数据,处理这些数据,并以用户友好的方式展示信息。无论你是编程新手还是想扩展你的项目库,这篇文章都会给你提供有价值的见解和代码示例。