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

पायथन में समान सेट बिट्स वाली अगली बड़ी संख्या ढूंढने का प्रोग्राम

एक संख्या n दी गई है। n से बड़ी सबसे छोटी संख्या ढूंढें जिसमें n के बराबर सेट बिट्स (1s) हों।

उदाहरण

इनपुट: n = 7 (बाइनरी: 0111)

आउटपुट: 11 (बाइनरी: 1011)

दोनों में तीन 1s हैं।

एल्गोरिदम (बिट मैनिपुलेशन)

  1. copy = n, zeros = 0, ones = 0।
  2. अंतिम 0s गिनें: जब तक copy सम है और शून्य नहीं, zeros++, copy >>= 1।
  3. उसके बाद के 1s गिनें: जब तक copy विषम है, ones++, copy >>= 1।
  4. right = ones + zeros (दाएं से पहली गैर-अंतिम स्थिति)।
  5. n |= (1 << right) (वह बिट सेट करें)।
  6. n &= ~((1 << right) - 1) (दाएं के सभी बिट्स क्लियर करें)।
  7. n |= (1 << (ones - 1)) - 1 (सबसे कम महत्वपूर्ण बिट्स पर ones-1 1s सेट करें)।
  8. n वापस करें।

पायथन कार्यान्वयन

class Solution:
    def solve(self, n):
        copy = n
        zeros = 0
        ones = 0
        
        # अंतिम 0s गिनें
        while copy and not (copy & 1):
            zeros += 1
            copy >>= 1
        
        # उसके बाद के 1s गिनें
        while copy & 1:
            ones += 1
            copy >>= 1
        
        right = ones + zeros
        n |= 1 << right              # right बिट सेट करें
        n &= ~((1 << right) - 1)     # right के दाएं सब क्लियर करें
        n |= (1 << (ones - 1)) - 1   # सबसे दाएं (ones-1) बिट्स सेट करें
        return n

# परीक्षण
ob = Solution()
print(ob.solve(7))    # 11 (0111 → 1011)
print(ob.solve(11))   # 13 (1011 → 1101)
print(ob.solve(1))    # 2 (01 → 10)
print(ob.solve(5))    # 6 (101 → 110)

समय जटिलता

  • O(log n) बिट्स की संख्या के अनुपात में।
  • स्थान: O(1)।

वैकल्पिक: ब्रायन कर्निघन का एल्गोरिदम

अगली संख्या = n + (n & -n) फिर बिट्स पुनर्व्यवस्थित करें। लेकिन उपरोक्त विधि मानक और स्पष्ट है।

  1. Python से सबट्री में समान लेबल वाले नोड्स की संख्या कैसे ढूंढें? Python से सबट्री में समान लेबल वाले नोड्स की संख्या कैसे ढूंढें?

    रूटेड ट्री में प्रत्येक नोड के लिए, उसके सबट्री में उसी लेबल वाले नोड्स की संख्या ढूंढें (लेबल्स लोअरकेस लेटर्स)। एल्गोरिदम एज लिस्ट से ग्राफ बनाएं (अनडायरेक्टेड)। लेबल मैप बनाएं। रिकर्सिव DFS r(ni): चिल्ड्रन के काउंटर्स मर्ज करें, अपना लेबल जोड़ें, R[ni] = count[label]। पैरेंट लिंक हटाकर साइकिल अव

  1. - पायथन प्रोग्राम: लिस्ट में सबसे बड़ी संख्या ढूंढें

    इस लेख में, हम दिए गए प्रॉब्लम स्टेटमेंट को हल करने के समाधान और दृष्टिकोण के बारे में सीखेंगे। प्रॉब्लम स्टेटमेंट लिस्ट इनपुट दिए जाने पर, हमें दी गई लिस्ट में सबसे बड़ी संख्या ढूंढने की आवश्यकता है। यहां हम दो दृष्टिकोणों पर चर्चा करेंगे: सॉर्टिंग तकनीकों का उपयोग करना बिल्ट-इन max() फंक्शन का

  1. - पायथन प्रोग्राम: 1 से n तक सभी नंबर्स में टोटल सेट बिट्स गिनना

    एक पॉजिटिव इंटीजर n दिया गया है, फिर हम इसे बाइनरी प्रतिनिधित्व में बदलते हैं और टोटल सेट बिट्स की संख्या गिनते हैं।उदाहरणInput: n=3 Output: 4एल्गोरिदमचरण 1: पॉजिटिव इंटीजर डेटा इनपुट करें। चरण 2: फिर इसे बाइनरी फॉर्म में कन्वर्ट करें। चरण 3: वेरिएबल s = 0 इनिशियलाइज़ करें। चरण 4: हर एलिमेंट को ट्रै