ধরুন আমাদের একটি ধনাত্মক 32-বিট পূর্ণসংখ্যা n আছে, আমাদেরকে সবচেয়ে ছোট 32-বিট পূর্ণসংখ্যাটি খুঁজে বের করতে হবে যেটির পূর্ণসংখ্যা n-এ বিদ্যমান একই সংখ্যা রয়েছে এবং n-এর থেকে মান বেশি। যদি আমাদের কাছে এমন কোনো ইতিবাচক 32-বিট পূর্ণসংখ্যা না থাকে, তাহলে -1 ফেরত দিন।
সুতরাং সংখ্যাটি যদি 213 হয়, তাহলে ফলাফল 231 হবে।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- s :=n স্ট্রিং হিসাবে, sz :=s এর আকার, ঠিক আছে :=মিথ্যা
- sz - 2 থেকে 0
- রেঞ্জে i জন্য
- যদি s[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