📜  找到A的最小排列大于B

📅  最后修改于: 2021-04-26 18:21:20             🧑  作者: Mango

给定两个数字AB ,任务是找到A的数字排列,使其刚好大于给定的数字B ,即,找到A的最小值排列大于B。如果没有这样的排列,则打印-1

例子:

方法:想法是使用next_permutation()和stol()。可以按照以下步骤计算答案:

  1. 将两个数字都用作String输入,以利用next_permutation()。
  2. 使用stol()查找B的长值。
  3. 然后找到数字A的最低排列。
  4. 对于A的每个排列,请检查数字是否大于B。
  5. 如果任何排列大于数字B,则它是可能的答案之一。选择所有可能答案中的最小值。
  6. 如果没有这样的数字,则打印-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