C++ 中最接近 K 的子陣列的按位與


在這個問題中,我們給定一個大小為 n 的陣列 arr[] 和一個整數 k。我們的任務是從索引 i 到 j 找到子陣列,並計算其所有元素的按位與。然後列印 |K-(子陣列的按位與)| 的最小值。

讓我們來看一個例子來理解這個問題:

輸入 − arr[] = {5, 1}, k = 2

輸出

解決這個問題,可以有幾種方法。

一個簡單的解決方案是使用直接方法。透過找到所有子陣列的按位與,然後找到 |K-X|。

步驟 1 − 查詢所有子陣列的按位與。

步驟 2 − 對於從步驟 1 中找到的每個值(例如 X)。找到 |k - X| 的值。

步驟 3 − 將上面在 min 變數中找到的最小值儲存起來。

步驟 4 − 最後,列印 min。

示例

程式說明了我們解決方案的工作原理:

 線上演示

#include <iostream>
using namespace std;
int CalcBitwiseANDClosestK(int arr[], int n, int k){
   int minimum = 1000;
   for (int i = 0; i < n; i++) {
      int X = arr[i];
      for (int j = i; j < n; j++) {
         X &= arr[j];
         minimum = min(minimum, abs(k - X));
      }
   }
   return minimum;
}
int main() {
   int arr[] = { 1, 6 , 4, 9, 7 };
   int n = sizeof(arr) / sizeof(arr[0]);
   int k = 5;
   cout<<"Minimum value difference between Bitwise AND of sub-array and K is "<<CalcBitwiseANDClosestK(arr, n, k);
   return 0;
}

輸出

Minimum value difference between Bitwise AND of sub-array and K is 1

另一個解決方案可能是觀察子陣列中的 AND 運算。按位與有一個特性,它永遠不會增加。所以,我們必須檢查最小差值,當 X ≤ K 時,最小差值會增加。

示例

 線上演示

#include <iostream>
using namespace std;
int CalcBitwiseANDClosestK(int arr[], int n, int k){
   int minimum = 1000000;
   for (int i = 0; i < n; i++) {
      int BitwiseAND = arr[i];
      for (int j = i; j < n; j++) {
         BitwiseAND &= arr[j];
         minimum = min(minimum, abs(k - BitwiseAND));
         if (BitwiseAND <= k)
            break;
      }
   }
   return minimum;
}
int main() {
   int arr[] = {1, 6 , 4, 9, 7 };
   int n = sizeof(arr) / sizeof(arr[0]);
   int k = 5;
   cout<<"Minimum value difference between Bitwise AND of sub-array and K is "<<CalcBitwiseANDClosestK(arr, n, k);
   return 0;
}

輸出

Minimum value difference between Bitwise AND of sub-array and K is 1

更新於:2020年8月5日

1K+ 瀏覽量

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.