给定n个整数,得到n个数拼成的最大值和最小值
程序员文章站
2023-12-27 18:16:27
...
解题思路:
自定义一种字符串的比较规则:即如果A+B>B+A,则我们认为A>B。且可以证明:如果A+B>=B+A,B+C>=C+B,则一定有:A+C>=C+A。
分3步,先把n个数字转换成字符串存储;
再按照自定义的规则把n个字符串排序;
最后按照从小到大的顺序输出这些字符串(如果从大到小则是求最大的多位整数)。
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>
#include <assert.h>
#include <list>
using namespace std;
//自定义判断字符串大小的函数
bool Compare_min(const string& s1, const string& s2)
{
string ss1 = s1+s2;
string ss2 = s2+s1;
return ss1 < ss2;
}
//判断拼接的小数字
string Min_number(vector<int> nums)
{
vector<string> nmstr;
string res;
if(nums.empty())
{
return " ";
}
//把数组转换为字符串
for(int i = 0; i < nums.size(); i++)
{
//定义一个字符串流来加载数组值
stringstream s;
s << nums[i]; //加载数组里的值
string tmp;
s >> tmp; //转换为字符串
nmstr.push_back(tmp);
}
if(Compare_min)
{
//从小到大排是最小的数字
sort(nmstr.begin(),nmstr.end());
}
//两两比较后不断加上后边的字符数组
for(int i = 0; i < nmstr.size(); i++)
{
res += nmstr[i];
}
return res;
}
//自定义比较大小
bool Compare_max(const string& s1, const string& s2)
{
string ss1 = s1+s2;
string ss2 = s2+s1;
return ss1 >= ss2;
}
//判断拼接的大数字
string Max_number(vector<int> nums)
{
vector<string> nmstr;
string res;
if(nums.empty())
{
return " ";
}
for(int i = 0; i < nums.size(); i++)
{
stringstream s;
s << nums[i];
string tmp;
s >> tmp;
nmstr.push_back(tmp);
}
sort(nmstr.begin(),nmstr.end(),Compare_max);
for(int i = 0; i < nums.size(); i++)
{
res += nums[i];
}
return res;
}
int main()
{
int n;
cin >> n;
vector<int> nums(n);
for(int i = 0; i < n; i++)
{
cin >> nums[i];
}
cout << "最小的数字是" << Min_number(nums) << endl;
cout << "最大的数字是" << Max_number(nums) << endl;
return 0;
}
推荐阅读
-
设计一个算法:用不多于3n/2的平均比较次数,在数组A[1,...,n]中找出最大值和最小值的元素
-
给定n个整数,得到n个数拼成的最大值和最小值
-
给出n个数,找出这n个数的最大值,最小值,和。
-
n个数的最大值和最小值
-
输入N个数,求这N个数的和并求出最大值和最小值
-
分治算法求n个元素的最大值和最小值
-
给定n个数,要求比较次数1.5n同时找出最大值和最小值
-
【练习题】给定两个整数n和k,返回1 ... n中k个数的所有组合
-
任意给定一个正整数N, 如果是偶数,执行: N / 2 如果是奇数,执行: N * 3 + 1 生成的新的数字再执行同样的动作,循环往复。 通过观察发现,这个数字会一会儿上升到很高, 一会儿又降落下
-
C#求n个数中最大值和最小值的方法