基于数字优先级的下一个更大数


在正常的数字系统中,0 是最小的数字,而 9 是最大的数字。在这个问题中,我们将得到一个长度为 10 的列表,从索引 0 到索引 9,它代表一个数字,表示该数字的优先级,并且列表将按升序排列,这意味着最后索引处的数字具有最高优先级。我们也将得到一个数字,并且我们必须找到下一个比当前数字大一点的数字。

Input 1: 
Given number = “123”
Given array = { 9, 2, 3, 6, 8, 1, 0, 5, 4, 7}
Output: 132

解释

从给定的优先级数组中,我们可以看到 1 的优先级大于 2 和 3。3 的优先级大于 2。因此,如果给定数字的下一个排列将通过交换 2 和 3 来实现。

Input 2:
Given number = 132
Given array = { 9, 2, 3, 6, 8, 1, 0, 5, 4, 7}
Output: 132

解释

从给定的优先级数组中,我们可以看到 1 的优先级大于 2 和 3。3 的优先级大于 2。因此,将没有可用的下一个排列。

方法

在这种方法中,我们将使用 C++ 编程语言提供的标准模板库 (STL) 的概念来获取下一个排列。让我们看看步骤 -

  • 首先,我们将得到要从中找到下一个数字的数字,以及一个指示数字优先级(按升序排列)的数组。

  • 我们将调用预定义函数来查找下一个比当前给定数字大的数字。

  • 我们将定义一个函数,该函数将获取给定数字和数组作为参数。

  • 我们将定义一个全局数组,并存储从给定数组中获取的每个数字的优先级,以便稍后使用。

  • 我们将给定数字转换为字符串,以便在其上应用下一个排列函数。

  • 我们将定义一个自定义函数,该函数将用于在 stl 的下一个排列函数中比较字符串的字符。

  • 获取下一个排列后,我们将字符串转换为整数并返回它。

示例

#include <bits/stdc++.h>
using namespace std;
// priority array or array in which the priority of each digit will be stored 
int prio[10];
// defining the compare function 
bool compare(char& a, char& b){
   return prio[a-'0'] < prio[b-'0'];
}
// function to get the next permuatation 
int nextNum(int n, int arr[]){
   for(int i=0; i<10; i++){
      prio[arr[i]] = i;
   }
   // converting the given number into string 
   string str = to_string(n);
   // calling the next permuatation stl function for the given string we will compare by custom function 
   bool cur = next_permutation(str.begin(),str.end(),compare);
   if(cur == false){
      // indicating the next permutation does not exist 
      return n;
   }
   n = stoi(str); // converting string back to number 
   return n;
}
int main(){
   int n = 312; // the given number 
   int arr[] = {9, 2, 3, 6, 8, 1, 0, 5, 4, 7}; // given array
   cout<<"The next number or permutation for the given number is: "<<nextNum(n, arr);
   return 0;
}

输出

The next number or permutation for the given number is: 123

时间和空间复杂度

上述代码的时间复杂度为 O(N),其中 N 是给定数字中数字的个数。

上述代码的空间复杂度为 O(N),因为我们正在创建一个新的字符串来使用下一个排列函数。

注意:如果当前数字是所有排列中最大的数字,则下一个排列函数将返回 false,我们将返回相同的数字,因为下一个排列不存在。

结论

在本教程中,我们实现了查找下一个比当前数字大一点的数字的代码,但数字的优先级将不是从 0 到 9 的相同顺序,而是将在单独的数组中给出。我们使用了 STL 函数 next_permutation 和一个自定义函数来根据新的优先级获取下一个数字。上述代码的时间和空间复杂度为 O(数字个数)。

更新于: 2023年5月16日

95 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告