前缀表达式是一种非常常见和重要的知识点,如果你还不知道,那就赶紧点进来看看吧!
题目地址(1310. 子数组异或查询)
https://leetcode-cn.com/problems/xor-queries-of-a-subarray
题目描述
1 | 有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] = [Li, Ri]。 |
暴力法
思路
最直观的思路是双层循环即可,果不其然超时了。
代码
1 |
|
前缀表达式
思路
比较常见的是前缀和,这个概念其实很容易理解,即一个数组中,第 n 位存储的是数组前 n 个数字的和。
对 [1,2,3,4,5,6] 来说,其前缀和可以是 pre=[1,3,6,10,15,21]。我们可以使用公式 pre[𝑖]=pre[𝑖−1]+nums[𝑖]得到每一位前缀和的值,从而通过前缀和进行相应的计算和解题。其实前缀和的概念很简单,但困难的是如何在题目中使用前缀和以及如何使用前缀和的关系来进行解题。
这道题是前缀对前缀异或,我们利用了异或的性质 x ^ y ^ x = y
。
代码
代码支持 Python3,Java,C++:
Python Code:
1 | # |
Java Code:
1 | public int[] xorQueries(int[] arr, int[][] queries) { |
C++ Code:
1 | class Solution { |
关键点解析
- 异或的性质 x ^ y ^ x = y
- 前缀表达式