在 C++ 中,使用最多一次交换操作来形成最小数字
c++server side programmingprogramming更新于 2025/5/31 11:37:17
在这个问题中,我们得到了一个正整数。我们的任务是创建一个程序,使用最多一次交换操作来形成较小的数字。
我们将使用现有数字的数字创建一个新数字。形成的最小数字只能从现有数字中交换一位数字。
让我们举一个例子来理解这个问题
输入:n = 63519 输出:36519
解决方法
解决问题的一种方法是找到通过交换给定数字的一对数字而创建的所有数字。在所有这些交换的数字中,返回最小的数字。为此,我们将数字转换为字符串并交换位置。
示例
程序用于说明我们的解决方案的工作原理
#include <iostream> using namespace std; int findSmallestNumSwapDig(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<<"交换一位数字得到的最小数字为 "<<findSmallestNumSwapDig(num) << endl; return 0; }
输出
该数字为 792156 交换一位数字得到的最小数字为 192756
另一种方法
解决这个问题的另一种方法是使用额外的辅助数组 aux[]。此数组用于存储当前索引右侧(较大索引)最小数字的索引,即 aux[i] 是数字右侧最小数字的索引。如果不存在这样的数字,则初始化 aux[i] = -1。现在,遍历从索引 0 到 n-1 的数字,并在 aux[] 数组中找到小于当前值的数字。对于索引 0 的值,检查非零元素,如果出现 0,则丢弃该值。如果找到任何元素,则交换 arr[i] & arr[aux[i]] 并返回创建的数字。
示例
程序来说明我们的解决方案的工作原理
#include <bits/stdc++.h> using namespace std; int findSmallestNumSwapDig(int N){ string num = to_string(N); int n = num.size(); int auxArr[n], right; auxArr[n - 1] = -1; right = n - 1; for (int i = n - 2; i >= 1; i--) { if (num[i] >= num[right]) auxArr[i] = right; else { if (num[i] == num[i + 1]) auxArr[i] = right; else { auxArr[i] = -1; right = i; } } } int small = -1; for (int i = 1; i < n; i++) if (num[i] != '0') { if (small == -1) { if (num[i] < num[0]) small = i; } else if (num[i] <= num[small]) small = i; } if (small != -1) swap(num[0], num[small]); else { for (int i = 1; i < n; i++) { if (auxArr[i] != -1 && num[i] != num[auxArr[i]]) { swap(num[i], num[auxArr[i]]); break; } } } return stoi(num); } int main(){ int num = 792156; cout<<"该数字为"<<num<<endl; cout<<"交换一位数字后得到的最小数字为" <<findSmallestNumSwapDig(num)<< endl; return 0; }
输出
该数字为 792156 交换一位数字后得到的最小数字为 192756