基於數字優先順序的下一個更大數


在正常的數字系統中,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 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.