使用最多一次交换操作形成最大数字 C++

c++server side programmingprogramming更新于 2025/5/31 12:07:17

在这个问题中,我们得到了一个正整数。我们的任务是创建一个程序,使用最多一次交换操作形成最大数字。

我们将使用现有数字的数字创建一个新数字。

形成的最大数字只能从现有数字中交换一位数字。

让我们举一个例子来理解这个问题

输入:n = 63512
输出:65312

解决方法

解决问题的一种方法是找到通过交换给定数字的一对数字而创建的所有数字。在所有这些交换数字的数字中,返回最大的一个。为此,我们将数字转换为字符串并交换位置。

示例

用于说明我们解决方案工作原理的程序

#include <iostream>
using namespace std;

int findLargestNumSwapDig(int N){

   string strNum = to_string(N);
   string temp = strNum;
   for (int i = 0; i < strNum.size(); i++) {
      for (int j = i + 1; j < strNum.size(); j++) {
         swap(strNum[i], strNum[j]);
         if (stoi(strNum) > stoi(temp))
            temp = strNum;
         swap(strNum[i], strNum[j]);
      }
   }
   return stoi(temp);
}
int main(){
   int num = 792156;
   cout<<"该数字为 "<<num<<endl;
   cout<<"交换一位数字所产生的最大数字为 "<<findLargestNumSwapDig(num) << endl;
   return 0;
}

输出

该数字为 792156
交换一位数字所产生的最大数字为 972156

另一种方法

解决这个问题的另一种方法是找到有助于产生最大可能数字的交换。为此,我们将从左到右扫描数字。然后交换第一个数字对,使下一个数字大于前一个数字。此交换将产生最大的数字。

示例

程序用于说明我们的解决方案的工作原理

#include <iostream>
using namespace std;

int findLargestNumSwapDig(int N){

   int currMaxDig = -1;
   int currMaxInd = -1;
   int lSwap = -1;
   int rSwap = -1;

   string strNum = to_string(N);
   for (int i = strNum.size() - 1; i >= 0; i--) {

      if (strNum[i] > currMaxDig) {
         currMaxDig = strNum[i];
         currMaxInd = i;
         continue;
      }
      if (strNum[i] < currMaxDig) {
         lSwap = i;
         rSwap = currMaxInd;
      }
   }
   if (lSwap == -1)
      return N;
   swap(strNum[lSwap], strNum[rSwap]);
   return stoi(strNum);
}
int main(){
   int num = 792156;
   cout<<"该数字为 "<<num<<endl;
   cout<<"交换一位数字后得到的最大数字为 "<<findLargestNumSwapDig(num) << endl;
   return 0;
}

输出

该数字为 792156
交换一位数字后得到的最大数字为 972156

相关文章