কম্পিউটার

C++ এ পরবর্তী বৃহত্তর উপাদান III


ধরুন আমাদের একটি ধনাত্মক 32-বিট পূর্ণসংখ্যা n আছে, আমাদেরকে সবচেয়ে ছোট 32-বিট পূর্ণসংখ্যাটি খুঁজে বের করতে হবে যেটির পূর্ণসংখ্যা n-এ বিদ্যমান একই সংখ্যা রয়েছে এবং n-এর থেকে মান বেশি। যদি আমাদের কাছে এমন কোনো ইতিবাচক 32-বিট পূর্ণসংখ্যা না থাকে, তাহলে -1 ফেরত দিন।

সুতরাং সংখ্যাটি যদি 213 হয়, তাহলে ফলাফল 231 হবে।

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • s :=n স্ট্রিং হিসাবে, sz :=s এর আকার, ঠিক আছে :=মিথ্যা
  • sz - 2 থেকে 0
      রেঞ্জে i জন্য
    • যদি s[i]
  • যদি মিথ্যা হয়, তাহলে ফিরুন – 1
  • সবচেয়ে ছোট :=i, curr :=i + 1
  • j-এর জন্য i + 1 থেকে sz – 1
      পরিসরে
    • id s[j]> s[smallest] এবং s[j] <=s[curr], তারপর curr :=j
  • s[smallest] এর সাথে s[curr] বিনিময় করুন
  • aux :=সূচক 0 থেকে ক্ষুদ্রতম পর্যন্ত s এর সাবস্ট্রিং
  • রিভার্স অক্স
  • ret :=সূচক 0 থেকে ক্ষুদ্রতম + aux পর্যন্ত s এর সাবস্ট্রিং
  • রিটার্ন -1 যদি ret হয়> 32-বিট +ve পূর্ণসংখ্যা পরিসীমা, অন্যথায় রিটার্ন

আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

উদাহরণ

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int nextGreaterElement(int n) {
      string s = to_string(n);
      int sz = s.size();
      int i;
      bool ok = false;
      for(i = sz - 2; i >= 0; i--){
         if(s[i] < s[i + 1]) {
            ok = true;
            break;
         }
      }
      if(!ok) return -1;
      int smallest = i;
      int curr = i + 1;
      for(int j = i + 1; j < sz; j++){
         if(s[j] > s[smallest] && s[j] <= s[curr]){
            curr = j;
         }
      }
      swap(s[smallest], s[curr]);
      string aux = s.substr(smallest + 1);
      reverse(aux.begin(), aux.end());
      string ret = s.substr(0, smallest + 1) + aux;
      return stol(ret) > INT_MAX ? -1 : stol(ret);
   }
};
main(){
   Solution ob;
   cout << (ob.nextGreaterElement(213));
}

ইনপুট

213

আউটপুট

231

  1. C++ এ RLE ইটারেটর

  2. C++ এ কুৎসিত নম্বর III

  3. C++ এ পরবর্তী বৃহত্তর এলিমেন্ট II

  4. C++ এর আগের বৃহত্তর উপাদান