이 문제에서는 N개의 정수 값으로 구성된 배열 arr[]이 제공됩니다. 우리의 임무는 배열에서 짝수번 나타나는 첫 번째 요소를 찾는 프로그램을 만드는 것입니다. . 조건을 충족하는 요소가 있으면 반환하지 않으면 거짓을 나타내는 -1을 반환합니다. .
문제를 이해하기 위해 예를 들어 보겠습니다.
Input: arr[] = {2, 3, 7, 2, 3, 6, 4, 1, 2} Output: 3
솔루션 접근 방식
문제를 해결하는 간단한 방법은 배열의 각 요소를 하나씩 고려한 다음 해당 요소의 발생 빈도를 짝수 확인하고 배열의 첫 번째 요소를 짝수 발생 빈도로 반환하는 것입니다. 문제를 해결하는 또 다른 방법은 해시 맵을 사용하는 것입니다. 데이터 구조. 이를 위해 우리는 배열을 순회하고 짝수인지 아닌지에 따라 true 또는 false와 같은 토글로 발생 빈도와 함께 요소를 저장하는 해시 맵을 생성합니다. 이렇게 하면 토글이 필요한 결과를 표시하므로 발생 빈도가 참인지 거짓인지 확인하는 오버헤드가 줄어듭니다. 지도의 경우 값이 true인 첫 번째 요소(짝수 발생 빈도를 나타냄)가 필수 결과입니다.
배열을 탐색하고 각 값에 대해 배열, 즉 배열에서, 즉 우리는 맵에서 확인할 것입니다.
지도에 없으면 토글 값 'false로 지도에 추가합니다. '. 지도에 있는 경우 해당하는 현재 값(예:'true인 경우)을 토글합니다. ' '거짓으로 설정 ', '거짓이면 ' '참으로 설정 '.
배열을 반복한 후 맵을 반복하고 'true로 해당 값이 토글인 첫 번째 값을 반환합니다. '.
예시
솔루션 작동을 설명하는 프로그램
#include <bits/stdc++.h> using namespace std; int findFirstEvenFreqVal(int arr[], int n){ unordered_map<int, bool> freqTogMap; for (int i = 0; i < n; i++){ if (freqTogMap.find(arr[i]) == freqTogMap.end()) freqTogMap.insert(pair <int,bool> (arr[i],false)); else { bool val = freqTogMap.find(arr[i])->second; if (val == true) freqTogMap.find(arr[i])->second = false; else freqTogMap.find(arr[i])->second = true; } } int j = 0; for (j = 0; j < n; j++){ if (freqTogMap.find(arr[j])->second == true) return arr[j];; } return -1; } int main(){ int arr[] = { 2, 4, 6, 8, 1, 6 }; cout<<"The first element of the array which appears even number of times is " <<findFirstEvenFreqVal(arr, 6); return 0; }
출력
The first element of the array which appears even number of times is 6