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之路

1310. 子数组异或查询

1310. 子数组异或查询

1310. 子数组异或查询

LeetCode1310. 子数组异或查询 / 307. 区域和检索 - 数组可修改(线段树树状数组)

LeetCode 1310. 子数组异或查询 Java/C++ 前缀和