在 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
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP