কম্পিউটার টিউটোরিয়াল

পাইথনে লিস্ট কি কম-কম ৩ দৈর্ঘ্যের কনsekutিভ ইনক্রিজিং সাবলিস্টে ভাগ করা যায় কিনা যাচাই করার প্রোগ্রাম

একটি নন-ডিক্রিজিং অর্ডারে সাজানো লিস্ট nums দেওয়া আছে। আমাদের যাচাই করতে হবে কি এই লিস্টকে যেকোনো সংখ্যক সাবসিকোয়েন্সে ভাগ করা যায় যাতে প্রতিটি সাবসিকোয়েন্সের দৈর্ঘ্য কমপক্ষে ৩ এবং সেটি কনsekutিভ ইনক্রিজিং (যেমন ২,৩,৪)।

উদাহরণস্বরূপ, nums = [2, 3, 4, 4, 5, 6, 7] হলে আউটপুট True, কারণ [2,3,4] এবং [4,5,6,7]-এ ভাগ করা যায়।

সমাধানের পদ্ধতি (গ্রিডি + ফ্রিকোয়েন্সি কাউন্ট)

  1. counts = প্রতিটি সংখ্যার ফ্রিকোয়েন্সি (Counter)।
  2. starts, ends = দুটি লিস্ট।
  3. সর্টেড ইউনিক ভ্যালু x এর জন্য:
    • যদি count[x] > count[x-1], তবে (count[x] - count[x-1])টি নতুন সিকোয়েন্স x-এ শুরু হয় → starts-এ যোগ করুন।
    • যদি count[x] > count[x+1], তবে (count[x] - count[x+1])টি সিকোয়েন্স x-এ শেষ হয় → ends-এ যোগ করুন।
  4. সব (start, end) পেয়ারের জন্য start + 2 <= end (দৈর্ঘ্য ≥ ৩) কিনা চেক করুন। সবই সঠিক হলে True, অন্যথায় False।

পাইথন কোড উদাহরণ

from collections import Counter

class Solution:
    def solve(self, nums):
        count = Counter(nums)
        starts = []
        ends = []
        for x in sorted(count):
            if count[x] > count[x-1]:
                starts.extend([x] * (count[x] - count[x-1]))
            if count[x] > count[x+1]:
                ends.extend([x] * (count[x] - count[x+1]))
        return all(s + 2 <= e for s, e in zip(starts, ends))

ob = Solution()
nums = [2, 3, 4, 4, 5, 6, 7]
print(ob.solve(nums))

ইনপুট

[2, 3, 4, 4, 5, 6, 7]

আউটপুট

True
  1. পাইথনে ব্লকের তালিকা y=x রেখা দিয়ে সিমেট্রিক কিনা যাচাই করার প্রোগ্রাম

  2. পাইথনে একটি স্ট্রিংকে অন্য স্ট্রিংএ 1-to-1 ম্যাপ করা সম্ভব কিনা যাচাই করার প্রোগ্রাম

  3. পাইথনে লিস্ট স্ট্রিক্টলি ইনক্রিজিং বা ডিক্রিজিং কিনা যাচাই করার প্রোগ্রাম

  4. পাইথনে লিস্ট খালি কিনা যাচাই করার প্রোগ্রাম