在C ++中仅使用一次交换操作就可能获得尽可能大的小数

在本教程中,我们将编写一个程序,该程序查找一次交换的最大数目,该数目小于给定数目n。

让我们看看解决问题的步骤。

  • 初始化数字n。

  • 从字符串的末尾进行迭代,找到大于下一个数字的数字的索引。将其存储在变量中。

  • 一旦找到它就中断循环。

  • 从字符串的末尾到上面的索引遍历数字。

    • 找到该数字的索引,该数字要比上面的索引数字小,并且在该区域的所有数字中要大。

  • 交换上面两个索引处的数字。返回更新的number。

示例

让我们看一下代码。

#include <bits/stdc++.h>
using namespace std;
string getTheNumber(string str) {
   int length = str.length();
   int index = -1;
   for (int i = length - 2; i >= 0; i--) {
      if (str[i] > str[i+1]) {
         index = i;
         break;
      }
   }
   int smallerDigitIndex = -1;
   for (int i = length - 1; i > index; i--) {
      if (str[i] < str[index]) {
         if (smallerDigitIndex == -1 || str[i] >= str[smallerDigitIndex]) {
            smallerDigitIndex = i;
         }
      }
   }
   if (index == -1) {
      return "-1";
   }
   if (smallerDigitIndex != -1) {
      swap(str[index], str[smallerDigitIndex]);
      return str;
   }
   return "-1";
}
int main() {
   string str = "54624";
   cout << getTheNumber(str) << endl;
   return 0;
}

输出结果

如果运行上面的代码,则将得到以下结果。

54426