在 C++ 中使用至多一次交換操作求下一更大的數


給定一個數 n,交換該數字的任意兩個數字,使得結果數大於數 n。如果不可能,則列印 -1。我們來看個例子。

輸入

12345

輸出

12354

我們交換了數字 4 和 5。於是我們用一次交換得到一個更大的數。

演算法

  • 如果數字的各位數按降序排列,那麼就不可能組成這個數。

  • 從數的右邊開始找到小於最後一位數的數字的索引。

  • 找到大於前一位數且小於所有位數的數字的索引。

  • 交換兩個數字並返回新數字。

  • 返回新數字。

實現

以下是 C++ 中上述演算法的實現

#include <bits/stdc++.h>
using namespace std;
string getNextHigherNumber(string num) {
   int len = num.size();
   int firstDigitIndex = -1;
   for (int i = len - 2; i >= 0; i--) {
      if (num[i] < num[len - 1]) {
         firstDigitIndex = i;
         break;
      }
   }
   if (firstDigitIndex == -1) {
      return "-1";
   }
   int secondDigitIndex = -1;
   for (int i = len - 1; i > firstDigitIndex; i--) {
   if (num[i] > num[firstDigitIndex]) {
      if (secondDigitIndex == -1 || num[i] <= num[secondDigitIndex]) {
         secondDigitIndex = i;
         }
      }
   }
   char temp = num[firstDigitIndex];
   num[firstDigitIndex] = num[secondDigitIndex];
   num[secondDigitIndex] = temp;
   return num;
}

int main() {
   string num = "12345";
   cout << "Given number: " << num << endl;
   cout << "Next higher number: " << getNextHigherNumber(num) << endl;
   return 0;
}

輸出

如果您執行上面的程式碼,那麼您將得到以下結果。

Given number: 12345
Next higher number: 12354

更新日期: 25-Oct-2021

89 次瀏覽

提升你的職業生涯

透過完成課程獲取認證

立即開始
廣告