Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में बाइनरी प्रतिनिधित्व में दो तत्काल 1 के बीच अधिकतम 0 की संख्या


समस्या कथन

एक संख्या n दी गई है, कार्य दिए गए n के बाइनरी प्रतिनिधित्व में दो तत्काल 1 के बीच अधिकतम 0 की संख्या ढूंढना है। यदि बाइनरी प्रतिनिधित्व में दो से कम 1 हैं तो -1 वापस करें।

उदाहरण

यदि इनपुट संख्या 35 है तो इसका बाइनरी प्रतिनिधित्व है:

00100011

उपरोक्त बाइनरी प्रतिनिधित्व में दो तत्काल 1 के बीच 3 शून्य हैं। इसलिए उत्तर 3 है।

एल्गोरिदम

हम इस समस्या को हल करने के लिए बिटवाइज शिफ्ट ऑपरेटर का उपयोग कर सकते हैं। हमें n के बाइनरी प्रतिनिधित्व में दो तत्काल 1 की स्थिति ढूंढनी होगी और इन स्थितियों के अंतर को अधिकतम करना होगा।

  • यदि संख्या 0 या 2 की घात है तो -1 वापस करें।
  • पहले दाएं सबसे 1 की स्थिति के साथ वेरिएबल prev को प्रारंभ करें। यह पहले देखे गए 1 की स्थिति संग्रहीत करता है।
  • एक और वेरिएबल cur लें जो prev के ठीक बाद तत्काल 1 की स्थिति संग्रहीत करता है।
  • cur - prev - 1 का अंतर लें, यह दो तत्काल 1 के बीच 0 की संख्या होगी और इसकी तुलना 0 के पिछले अधिकतम मान से करें और prev को अपडेट करें यानी अगले पुनरावृति के लिए prev = cur।
  • वेरिएबल setBit का उपयोग करें, जो n के सभी बिट्स को स्कैन करता है और वर्तमान बिट 0 या 1 है इसका पता लगाने में मदद करता है।

उदाहरण

#include <bits/stdc++.h>
using namespace std;

int getMaxZeros(int n) {
    if (n == 0 || (n & (n - 1) == 0)) {
        return -1;
    }
    int setBit = 1;
    int prev = 0;
    int i;
    for (i = 1; i < sizeof(int) * 8; ++i) {
        ++prev;
        if ((n & setBit) == setBit) {
            setBit = setBit << 1;
            break;
        }
        setBit = setBit << 1;
    }
    int maxZeros = INT_MIN;
    int cur = prev;
    for (int j = i + 1; j <= sizeof(int) * 8; ++j) {
        ++cur;
        if ((n & setBit) == setBit) {
            if (maxZeros < (cur - prev - 1)) {
                maxZeros = cur - prev - 1;
                prev = cur;
            }
        }
        setBit = setBit << 1;
    }
    return maxZeros;
}

int main() {
    int n = 35;
    cout << "Maximum zeros = " << getMaxZeros(n) << endl;
    return 0;
}

आउटपुट

Maximum zeros = 3
  1. C++ में BST के दो नोड्स के बीच अधिकतम तत्व C++ में BST के दो नोड्स के बीच अधिकतम तत्व

    समस्या कथन N तत्वों का एक ऐरे और दो पूर्णांक A, B दिए गए हैं जो दिए गए ऐरे से संबंधित हैं। arr[0] से arr[n-1] तक तत्व डालकर एक बाइनरी सर्च ट्री बनाएं। कार्य A से B तक के पथ में अधिकतम तत्व ढूंढना है। उदाहरण यदि ऐरे है {24, 23, 15, 36, 19, 41, 25, 35} तो हम BST को निम्नानुसार बना सकते हैं: यदि हम

  1. बाइनरी ट्री के दो नोड्स के बीच की दूरी खोजें C++ में बाइनरी ट्री के दो नोड्स के बीच की दूरी खोजें C++ में

    मान लीजिए हमारे पास कुछ नोड्स के साथ एक बाइनरी ट्री है। हमें दो नोड्स u और v के बीच की दूरी खोजनी है। मान लीजिए ट्री नीचे जैसा है - अब (4, 6) के बीच की दूरी = 4, पथ की लंबाई 4 है, (5, 8) के बीच की लंबाई = 5 आदि। इस समस्या को हल करने के लिए, हम LCA (निम्नतम सामान्य पूर्वज) खोजेंगे, फिर LCA से दो नोड

  1. C++ प्रोग्राम: बाइनरी ट्री में किन्हीं दो नोड्स के बीच पथ प्रिंट करना C++ प्रोग्राम: बाइनरी ट्री में किन्हीं दो नोड्स के बीच पथ प्रिंट करना

    हमें एक बाइनरी ट्री दिया गया है जिसके नोड्स विशिष्ट हैं और उस बाइनरी ट्री के दो नोड्स दिए गए हैं जिनके बीच का पथ हम प्रिंट करना चाहते हैं। उदाहरण के लिए - हम नोड 140 से 211 के बीच का पथ प्रिंट करना चाहते हैं तो इसका आउटपुट होना चाहिए - Output: 140->3->10->211 विचार यह है कि रूट नोड्स से दो