ধরুন আমাদের একটি সংখ্যা n আছে, আমাদের তার অঙ্কগুলির পরবর্তী বড় স্থানান্তর খুঁজে বের করতে হবে। যখন n ইতিমধ্যেই তার বৃহত্তম পারমুটেশনে থাকে, তখন এটিকে সবচেয়ে ছোট পারমুটেশনে ঘোরান৷
সুতরাং, যদি ইনপুট n =319 এর মত হয়, তাহলে আউটপুট হবে 391।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি ফাংশন makeArray() সংজ্ঞায়িত করুন, এটি x,
লাগবে -
একটি অ্যারে ret সংজ্ঞায়িত করুন
-
যখন x অ-শূন্য, কর −
-
ret এর শেষে x mod 10 সন্নিবেশ করুন
-
x :=x / 10
-
-
অ্যারে রিভার্স করুন
-
রিটার্ন রিটার্ন
-
একটি ফাংশন সংজ্ঞায়িত করুন (), এটি একটি অ্যারে v,
নেবে -
ret :=0
-
প্রতিটি উপাদানের জন্য আমি v
-
ret :=ret * 10
-
ret :=ret + i
-
-
রিটার্ন রিটার্ন
-
একটি ফাংশন getIndex() সংজ্ঞায়িত করুন, এটি একটি অ্যারে v,
নেবে -
ret :=-1
-
আরম্ভ করার জন্য i :=v এর আকার, যখন i>=1, আপডেট করুন (i 1 দ্বারা কম করুন), −
-
যদি v[i]> v[i - 1], তাহলে −
-
ret :=i
-
লুপ থেকে বেরিয়ে আসুন
-
-
-
যদি ret -1 এর সমান না হয়, তাহলে −
-
x :=v[ret - 1]
-
idx :=ret
-
j আরম্ভ করার জন্য :=ret + 1, যখন j
-
যদি v[j]
x হয়, তাহলে − -
idx :=j
-
-
-
বিনিময় v[ret - 1] এবং v[idx]
-
-
রিটার্ন রিটার্ন
-
প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -
-
একটি অ্যারে সংজ্ঞায়িত করুন v :=makeArray(num)
-
idx :=getIndex(v)
-
যদি idx -1 এর মত হয়, তাহলে −
-
অ্যারে সাজান v
-
-
অন্যথায়
-
অ্যারে সাজান v
-
-
রিটার্ন কম্বাইন(v)
উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector<int> makeArray(int x) {
vector<int> ret;
while (x) {
ret.push_back(x % 10);
x /= 10;
}
reverse(ret.begin(), ret.end());
return ret;
}
int combine(vector<int>& v) {
int ret = 0;
for (int i : v) {
ret *= 10;
ret += i;
}
return ret;
}
int getIndex(vector& v) {
int ret = -1;
for (int i = v.size() - 1; i >= 1; i--) {
if (v[i] > v[i - 1]) {
ret = i;
break;
}
}
if (ret != -1) {
int x = v[ret - 1];
int idx = ret;
for (int j = ret + 1; j < v.size(); j++) {
if (v[j] < v[idx] && v[j] > x) {
idx = j;
}
}
swap(v[ret - 1], v[idx]);
}
return ret;
}
int solve(int num) {
vector<int> v = makeArray(num);
int idx = getIndex(v);
if(idx == -1) {
sort(v.begin(), v.end());
}
else {
sort(v.begin() + idx, v.end());
}
return combine(v);
}
};
int solve(int n) {
return (new Solution())->solve(n);
}
int main(){
int n = 319;
cout << solve(n);
} ইনপুট
319
আউটপুট
391