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

C++-এ K ডিজিট রিমুভ করে সবচেয়ে ছোট সংখ্যা বানানো


ধরুন আমাদের একটি নন-নেগেটিভ ইন্টিজার num আছে যা স্ট্রিং হিসেবে রিপ্রেজেন্ট করা হয়েছে। আমাদের num থেকে k ডিজিট রিমুভ করতে হবে যাতে নতুন সংখ্যাটি সম্ভাব্য সবচেয়ে ছোট হয়। ইনপুট “1432219” এবং k = 3 হলে রেজাল্ট হবে “1219”।

সমাধানের ধাপগুলো:

  • একটি স্ট্যাক st ডিফাইন করুন, একটি খালি স্ট্রিং ret তৈরি করুন

  • n := num-এর সাইজ

  • i = 0 থেকে n – 1 পর্যন্ত লুপ চালান

    • যখন k নন-জিরো এবং স্ট্যাক খালি নয় এবং st-এর টপ > num[i]

      • স্ট্যাক থেকে পপ করুন এবং k ১ কমান

    • num[i] st-এ পশ করুন

  • যখন k 0 নয়, স্ট্যাক থেকে এলিমেন্ট পপ করুন

  • যখন স্ট্যাক খালি নয়

    • ret := ret + st-এর টপ, স্ট্যাক থেকে এলিমেন্ট পপ করুন

  • এখন ret স্ট্রিং রিভার্স করুন

  • ans := খালি স্ট্রিং, i := 0

  • যখন i < ret-এর সাইজ এবং ret[i] != '0'

    • i ১ বাড়ান

  • i < ret-এর সাইজ পর্যন্ত লুপ চালান

    • ans := ans + ret[i]

  • ret := ans

  • যদি ret-এর সাইজ 0 হয় তবে "0" রিটার্ন করুন, অন্যথায় ret

উদাহরণ (C++)

নিচের ইমপ্লিমেন্টেশন দেখুন ভালো বুঝতে −

class Solution { public:    string removeKdigits(string num, int k) {       stack st;       string ret = "";       int n = num.size();       for(int i = 0; i < n; i++){          while(k && !st.empty() && st.top() > num[i]){             st.pop();             k--;          }          st.push(num[i]);       }       while(k--)st.pop();       while(!st.empty()){          ret += st.top();          st.pop();       }       reverse(ret.begin(), ret.end());       string ans = "";       int i = 0;       while(i <ret.size() && ret[i] == '0')i++;       for(; i < ret.size(); i++)ans += ret[i];       ret = ans;       return ret.size() == 0? "0" : ret;    } };

ইনপুট

"1432219" 3

আউটপুট

"1219"
  1. C++-এ জাম্প গেম V (Jump Game V)

  2. সি++-এ বিউটিফুল অ্যারে (Beautiful Array)

  3. C++ প্রোগ্রামে K ডিজিট রিমুভ করুন

  4. C++-এ ফোর ডিভাইজারস (Four Divisors) সমস্যা সমাধান