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

নেক্সট ক্লোজেস্ট টাইম খুঁজে বের করা C++-এ

সমস্যা বিবরণ

"HH:MM" ফরম্যাটে একটি টাইম দেওয়া আছে। বর্তমান টাইমের ডিজিটগুলো রি-ইউজ করে (বезবাধ ব্যবহার করে) পরবর্তী সবচেয়ে নিকটবর্তী টাইম বের করতে হবে। ২৪ ঘণ্টা ফরম্যাট।

উদাহরণ

ইনপুট: "19:34"

ডিজিটস: 1, 9, 3, 4

আউটপুট: "19:39" — কারণ ১৯:৩৯ সবচেয়ে নিকটবর্তী ভ্যালিড টাইম। ১৯:৩৩ হল ২৩ ঘণ্টা ৫৯ মিনিট পরে।

অ্যালগরিদম: ব্রুট ফোর্স (৪ নেস্টেড লুপ)

  1. ৪টি ডিজিট কালেক্ট করুন।
  2. ৪টি নেস্টেড লুপ দিয়ে সব সম্ভাব্য HH:MM কোম্বিনেশন জেনারেট করুন (৪^৪ = ২৫৬ কেস)।
  3. প্রতিটি কেসে:
    • HH ০০-২৩, MM ০০-৫৯ rango-এ কিনা চেক করুন।
    • বর্তমান টাইম থেকে ভিন্ন কিনা চেক করুন।
    • মিনিটে কনভার্ট করে ডিফারেন্স বের করুন (নেগেটিভ হলে ২৪*৬০ যোগ করুন)।
    • সর্বনিম্ন পজিটিভ ডিফারেন্স वालাটি রাখুন।

C++ বাস্তবায়ন

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

class Solution {
public:
    int toMinutes(string t) {
        int h = stoi(t.substr(0,2));
        int m = stoi(t.substr(3,2));
        return h * 60 + m;
    }

    string nextClosestTime(string time) {
        vector<char> digits = {time[0], time[1], time[3], time[4]};
        int cur = toMinutes(time);
        int bestDiff = INT_MAX;
        string ans = "";

        for (char h1 : digits)
            for (char h2 : digits)
                for (char m1 : digits)
                    for (char m2 : digits) {
                        string cand = string() + h1 + h2 + ":" + m1 + m2;
                        int h = stoi(cand.substr(0,2));
                        int m = stoi(cand.substr(3,2));
                        if (h > 23 || m > 59) continue;
                        if (cand == time) continue;
                        int diff = toMinutes(cand) - cur;
                        if (diff < 0) diff += 24 * 60;
                        if (diff < bestDiff) {
                            bestDiff = diff;
                            ans = cand;
                        }
                    }
        return ans.empty() ? time : ans;
    }
};

int main() {
    Solution ob;
    cout << ob.nextClosestTime("19:34"); // আউটপুট: 19:39
    return 0;
}

ইনপুট ও আউটপুট

ইনপুটআউটপুট
"19:34""19:39"

জটিলতা বিশ্লেষণ

  • সময় জটিলতা: O(1) — ২৫৬ ইটারেশন (কনস্ট্যান্ট)।
  • স্থান জটিলতা: O(1) — কনস্ট্যান্ট স্পেস।
  1. C++-এ স্ট্রিং ডিকোড করা

  2. C++-এ String at() মেথড ব্যবহার

  3. C++-এ স্ট্রিং টোকেনাইজেশন: স্ট্রিম এবং getline() ব্যবহার

  4. C++-এ স্ট্রিং টোকেনাইজ (Tokenize) করা