Giả sử chúng ta có một số n, chúng ta phải tìm hoán vị lớn hơn tiếp theo của các chữ số của nó. Khi n đã ở trong hoán vị lớn nhất của nó, sau đó xoay nó xuống hoán vị nhỏ nhất.
Vì vậy, nếu đầu vào là n =319, thì đầu ra sẽ là 391.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Xác định một hàm makeArray (), điều này sẽ lấy x,
-
Xác định ret mảng
-
trong khi x khác 0, do -
-
chèn x mod 10 vào cuối ret
-
x:=x / 10
-
-
đảo ngược mảng ret
-
trả lại ret
-
Xác định một hàm kết hợp (), điều này sẽ lấy một mảng v,
-
ret:=0
-
cho mỗi phần tử tôi trong v
-
ret:=ret * 10
-
ret:=ret + i
-
-
trả lại ret
-
Xác định một hàm getIndex (), điều này sẽ lấy một mảng v,
-
ret:=-1
-
để khởi tạo i:=size của v, khi i> =1, cập nhật (giảm i đi 1), thực hiện -
-
nếu v [i]> v [i - 1], thì -
-
ret:=i
-
Ra khỏi vòng lặp
-
-
-
nếu ret không bằng -1, thì -
-
x:=v [ret - 1]
-
idx:=ret
-
để khởi tạo j:=ret + 1, khi j
-
nếu v [j]
x, thì - -
idx:=j
-
-
-
trao đổi v [ret - 1] và v [idx]
-
-
trả lại ret
-
Từ phương thức chính, thực hiện như sau -
-
Xác định một mảng v:=makeArray (num)
-
idx:=getIndex (v)
-
nếu idx giống -1, thì -
-
sắp xếp mảng v
-
-
Nếu không
-
sắp xếp mảng v
-
-
return kết hợp (v)
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#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); }
Đầu vào
319
Đầu ra
391