একটি সংখ্যা দেওয়া থাকলে, সর্বোচ্চ একবার দুটি অঙ্ক স্ব্যাপ করে তার চেয়ে ছোট সবচেয়ে বড় সংখ্যা বের করতে হবে।
উদাহরণ
ইনপুট: 54624 → আউটপুট: 54426
অ্যালগরিদম
- ডান থেকে বামে স্ক্যান করে প্রথম পতন (drop) পয়েন্ট খুঁজুন (যেখানে
digit[i] > digit[i+1])। - সেটির ডান পাশ থেকে সেটি চেয়ে ছোট সবচেয়ে বড় অঙ্ক খুঁজুন।
- দুটো স্ব্যাপ করুন।
- না পারলে -১ ফেরত দিন।
সি++ ইমপ্লিমেন্টেশন
#include <bits/stdc++.h>
using namespace std;
string getLargestSmaller(string str) {
int len = str.length();
int idx = -1;
for (int i = len - 2; i >= 0; i--) {
if (str[i] > str[i+1]) { idx = i; break; }
}
if (idx == -1) return "-1";
int swapIdx = -1;
for (int i = len - 1; i > idx; i--) {
if (str[i] < str[idx] && (swapIdx == -1 || str[i] >= str[swapIdx]))
swapIdx = i;
}
if (swapIdx != -1) swap(str[idx], str[swapIdx]);
return str;
}
int main() {
string str = "54624";
cout << getLargestSmaller(str) << endl; // 54426
return 0;
}
আউটপুট
54426