给定两个数字A和B ,任务是找到A的数字排列,使其刚好大于给定的数字B ,即,找到A的最小值排列大于B。如果没有这样的排列,则打印-1
例子:
Input: A = 9236, B = 3125
Output: 3269
Explanation:
The minimum number greater than 3125 formed from the digits of A is 3269.
Input: A = 1234, B = 9879
Output: -1
方法:想法是使用next_permutation()和stol()。可以按照以下步骤计算答案:
- 将两个数字都用作String输入,以利用next_permutation()。
- 使用stol()查找B的长值。
- 然后找到数字A的最低排列。
- 对于A的每个排列,请检查数字是否大于B。
- 如果任何排列大于数字B,则它是可能的答案之一。选择所有可能答案中的最小值。
- 如果没有这样的数字,则打印-1 。
下面是上述方法的实现:
// C++ program to find the greater permutation
#include
using namespace std;
#define ll long long
#define inf 999999999999999999
// Function to find the greater permutation
ll solve(string a, string b)
{
ll n, val, ans = inf;
// Convert the string B to long
val = stol(b);
n = a.length();
// To find the lowest permutation
// of the number
sort(a.begin(), a.end());
// Find if the lowest permutation of A is
// greater than the given number B
if (stol(a) > val) {
ans = min((ll)stol(a), ans);
}
// Find all the permutations of A
while (next_permutation(a.begin(),
a.end())) {
if (stol(a) > val) {
ans = min((ll)stol(a), ans);
}
}
// If ans is not the initial value
// then return ans
if (ans != inf) {
return ans;
}
// Else return -1
else {
return -1;
}
}
// Driver code
int main()
{
string a, b;
ll ans;
a = "9236";
b = "3145";
ans = solve(a, b);
cout << ans;
}
输出:
3269