Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++를 사용하여 하나 이상의 비어 있지 않은 하위 배열의 비트 AND 숫자

<시간/>

배열이 주어지고 비어 있지 않은 적어도 하나의 하위 배열의 비트 AND인 모든 가능한 정수를 찾아야 하는 문제를 해결하려면 -

Input : nums[ ] = { 3, 5, 1, 2, 8 }
Output : { 2, 5, 0, 3, 8, 1 }
Explanation:
2 is the bitwise AND of subarray {2},
5 is the bitwise AND of subarray {5},
0 is the bitwise AND of subarray {1, 2}, {2, 8} and {1, 2, 8},
3 is the bitwise AND of subarray {3},
8 is the bitwise AND of subarray {8},
1 is the bitwise AND of subarray {1}, {3, 5} and {3, 5, 1}.

Input : nums[ ] = { 2, 6, 3, 8, 1 }
Output: { 1, 8, 3, 6, 2, 0 }

해결책을 찾기 위한 접근 방식

간단한 접근 방식 적용할 수 있는 것은

  • 비어 있지 않은 가능한 모든 하위 배열을 찾습니다.

  • 배열을 탐색하는 동안 하위 배열의 각 요소에 대한 비트 AND를 계산합니다.

  • 중복 값을 방지하려면 모든 결과를 집합에 저장하십시오.

예시

#include <bits/stdc++.h>
using namespace std;
int main(){
    int arr[] ={ 2, 6, 3, 8, 1 };
    int n = sizeof(arr) / sizeof(arr[0]);
    // Declaring set to store result of each AND operation.
    unordered_set<int> result;
    int val;
    // nested loops to traverse through all the possible non empty subarrays.
    for (int i = 0; i < n; ++i){
        for (int j = i, val = INT_MAX; j < n; ++j){
            val = val & arr[j];
            // storing result of AND operation
            result.insert(val);
        }
    }
    cout << "All possible numbers are: ";
    // printing all the values of set.
    for (auto i = result.begin(); i != result.end();i++)
        cout << *i << " ";
    return 0;
}

출력

All possible numbers are: 1 8 3 6 0 2

위 코드 설명

  • AND 연산의 모든 결과를 저장하도록 집합을 선언합니다.

  • 모든 비트를 1로 설정한 상태에서 AND 연산을 수행해야 하므로 INT_MAX로 'val' 변수를 초기화합니다.

  • i번째 인덱스에서 가능한 모든 하위 배열을 통과하는 내부 루프.

  • 각 요소의 AND 연산을 서로 및 자체적으로 계산하여 결과 집합에 저장합니다.

  • 결과 집합의 모든 값을 인쇄합니다.

결론

이 자습서에서는 이 문제를 해결하기 위한 간단한 접근 방식, 즉 가능한 모든 하위 배열에서 AND 연산을 계산하는 방법에 대해 논의했습니다. 우리는 또한 이 문제를 해결하기 위한 C++ 프로그램에 대해 논의했습니다. 또한 이 코드는 Java, C, Python 등과 같은 다른 언어로 작성할 수 있습니다. 이 튜토리얼이 도움이 되기를 바랍니다.