使用 C++ 查詢大小為 k 的子陣列的最大 XOR 值


在這個問題中,我們被給定一個具有 n 個元素的陣列 arr[] 和整數 k。我們的任務是找到大小為 k 的子陣列的最大 XOR 值。

讓我們舉一個例子來理解這個問題,

輸入

arr[] = {3, 1, 6, 2 ,7, 9} k = 3

輸出

12

說明

所有子陣列和所有元素的 XOR 大小為 k,

{3, 1, 6} = 4
{1, 6, 2} = 5
{6, 2, 7} = 3
{2, 7, 9} = 12

解決方案方法

解決這個問題的一種簡單方法是使用兩個迴圈。一個用來迭代陣列,另一個用來查詢子陣列的所有元素的 XOR。然後返回最大的值。

這個解決方案不錯,但是可以採用更好的方法來解決這個問題。我們需要從大小為 k 且以

索引 0 開始的子陣列開始查詢總和。然後迭代陣列並在 XOR 中新增一個新元素並刪除第一個元素。可以透過使用公式 x^a^x = a 輕鬆完成刪除。

因此,對於每次互動,我們首先執行 XOR ^ arr[i - k],這將給出從最後一個索引 + 1 到當前索引 - 1 的子陣列的值。

然後我們將子陣列的 XOR 與 arr[i] 執行 XOR 以獲得當前的 XOR。我們將查詢並從所有 XOR 中返回最大值。

程式來說明我們的解決方案的工作原理,

示例

 即時演示

#include<iostream>
using namespace std;
int findMaxSubArrayXOR(int arr[] , int n , int k) {
   int currentXORVal = 0 ;
   for (int i = 0 ; i < k ; i++)
   currentXORVal = currentXORVal ^ arr[i];
   int maxXor = currentXORVal;
   for (int i = k ; i < n; i++) {
      currentXORVal = currentXORVal ^ arr[i-k];
      currentXORVal = currentXORVal ^ arr[i];
      maxXor = max(maxXor, currentXORVal);
   }
   return maxXor;
}
int main() {
   int arr[] = {3, 1, 6, 2, 7, 9};
   int n = sizeof(arr)/sizeof(arr[0]);
   int k = 3;
   cout<<"The maximum XOR of subarray of size "<<k<<" is "<<findMaxSubArrayXOR(arr, n, k);
   return 0;
}

輸出

The maximum XOR of subarray of size 3 is 12

更新日期:2021 年 3 月 12 日

462 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

主辦一個免費課程試用版
廣告
© . All rights reserved.