मान लीजिए हमारे पास 3 पॉजिटिव नंबर a, b और c हैं। हमें a और b के कुछ बिट्स में आवश्यक न्यूनतम फ्लिप्स ढूंढने हैं ताकि (a OR b == c) हो जाए। यहां हम बिटवाइज OR ऑपरेशन पर विचार कर रहे हैं।
फ्लिप ऑपरेशन में किसी भी सिंगल बिट को 1 से 0 या 0 से 1 में उनके बाइनरी प्रतिनिधित्व में बदलना शामिल है। उदाहरण के लिए यदि a: 0010 और b: 0110 है, तो c 0101 है, फ्लिप्स के बाद a 0001 होगा, और b 0100 होगा।
समाधान दृष्टिकोण
- ans := 0
- i को 0 से 31 तक रेंज में लूप करें:
- bitC := (c >> i) AND 1
- bitA := (a >> i) AND 1
- bitB := (b >> i) AND 1
- यदि (bitA OR bitB) bitC के समान नहीं है, तो:
- यदि bitC 0 है:
- यदि bitA = 1 और bitB = 1, तो ans को 2 से बढ़ाएं, अन्यथा ans को 1 से बढ़ाएं
- अन्यथा ans को 1 से बढ़ाएं
- यदि bitC 0 है:
- ans वापस करें
C++ कार्यान्वयन उदाहरण
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int minFlips(int a, int b, int c) {
int ans = 0;
for (int i = 0; i < 32; i++) {
int bitC = (c >> i) & 1;
int bitA = (a >> i) & 1;
int bitB = (b >> i) & 1;
if ((bitA | bitB) != bitC) {
if (!bitC) {
if (bitA == 1 && bitB == 1) {
ans += 2;
} else {
ans += 1;
}
} else {
ans += 1;
}
}
}
return ans;
}
};
int main() {
Solution ob;
cout << (ob.minFlips(2, 6, 5));
return 0;
}
इनपुट
2 6 5
आउटपुट
3