1310. 子数组异或查询
Posted lgz0921
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1310. 子数组异或查询相关的知识,希望对你有一定的参考价值。
题目链接:https://leetcode-cn.com/problems/xor-queries-of-a-subarray/
思路:首先明确异或的运算规则0^0 = 0 , 1^1 =0 , 0^1 = 1^0 = 1。所以我们能知道两个相同的数异或是0,所以统计一下前缀异或的值即可。当给到l到r的时候只需要前缀位置是r的那个数异或前缀位置是l-1的那个数即可(这样意思就是说前r个数异或前l-1个数,这样前l-1个数异或了两边正好是0,这样就只剩下l到r异或的值了)。需要特判0到r的情况,0到r返回前缀位置是r的那个数即可。
举例说明算法核心:
arr[] = 2,3,4,5
求1到3的异或值,在算法中就是 2^(2^3^4^5) = 2^2^3^4^5 = 3^4^5 (前“1-1=0”个数异或前“3”个数,引号里是下标)
上代码:
class Solution {
fun xorQueries(arr: IntArray, queries: Array<IntArray>): IntArray {
for (i in 1 until arr.size) {
arr[i] = arr[i] xor arr[i - 1]
}
val result = IntArray(queries.size)
for (i in queries.indices) {
when (queries[i][0]) {
0 -> result[i] = arr[queries[i][1]]
else -> result[i] = arr[queries[i][1]] xor arr[queries[i][0] - 1]
}
}
return result
}
}
以上是关于1310. 子数组异或查询的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 1310 子数组异或查询[位运算 异或] HERODING的LeetCode之路