在 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
廣告