C++でサイズkのサブ配列の最大XOR値を見つける
この問題では、n個の要素と整数kで構成される配列arr[]が与えられます。私たちのタスクは、サイズkのサブ配列の最大XOR値を見つけることです。
問題を理解するために例を見てみましょう
入力
arr[] = {3, 1, 6, 2 ,7, 9} k = 3
出力
12
説明
すべてのサブ配列とサイズkのすべての要素のxor
{3, 1, 6} = 4 {1, 6, 2} = 5 {6, 2, 7} = 3 {2, 7, 9} = 12
ソリューションアプローチ
この問題の簡単な解決策は、2つのループを使用することです。 1つは配列を反復処理し、もう1つはサブ配列のすべての要素のXORを検索します。そして、すべての最大値を返します。
この解決策は問題ありませんが、問題を解決するためのより良いアプローチをとることができます。サイズkのサブ配列から開始して合計を見つける必要があります
。次に、配列を繰り返し、XORに新しい要素を追加し、最初の要素を削除します。式x^a ^ x=aを使用して削除できます。
したがって、最初に実行する相互作用ごとに、XOR ^ arr [i --k]を実行します。これにより、最後のインデックス+1から現在のインデックス-1までのサブアレイの値が得られます。
次に、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
-
C++で指定された値に最も近いk個の要素を検索します
要素が少ない配列Aがあるとします。他に2つの値Xとkがあります。私たちのタスクは、配列AからXの最も近い要素のk個を見つけることです。要素Xが配列に存在する場合、それは出力に表示されません。 A =[12、16、22、30、35、39、42、45、48、50、53、55、56]およびX =35、k =4の場合、出力は30、39、42、45になります。 。 これを解決するために、二分探索アプローチを使用します。これを使用して、クロスオーバーポイントを取得します。クロスオーバーポイントのインデックスが見つかった場合、O(k)時間でk個の最も近い要素を出力できます。 例 #include<i
-
C++の配列で最小値の頻度を見つける
ここでは、配列内の最小要素の頻度を見つける方法を説明します。配列要素が[5、3、6、9、3、7、5、8、3、12、3、10]であると仮定します。ここで、最小要素は3であり、この要素の頻度は4です。したがって出力は4です。 。 これを解決するために、リストの最小の要素を見つけ、最初の数字の出現を数え、それが結果になります。 例 #include<iostream> using namespace std; int min_element(int arr[], int n){ int min = arr[0]; &nb