-
设有n个正整数,将它们联接成一排,组成一个最小的多位整数。
程序输入:n个数
程序输出:联接成的多位数例如:
n=2时,2个整数32,321连接成的最小整数为:32132,
n=4时,4个整数55,31,312, 33 联接成的最小整数为:312313355[题目要求]
1. 给出伪代码即可,请给出对应的文字说明,并使用上面给出的例子试验你的算法。2. 给出算法的时间空间复杂度。
3. 证明你的算法。(非常重要)
方法就是把数字做为字符串来排序,排序的比较原则是: 两个数字串A,B,如果AB < BA,则A < B首先证明方法正确性:如果A小于其他所有数字串,则A应该在最前面假设某个A在中间的连接小于以A开头的连接,则为.....MA....,因为AM < MA,所以AM.... < MA....,所以把MA换成AM会变小。同理可知把A移到开头最小。然后具体比较方法:比较字符串的连接ab|adcde 31|312abcde|ab 312|31拿abcdeab和abcdeab比较 31312和31231比较
#include<cstring>
#include<vector>
#include <algorithm>
using namespace std;
bool cmp(const string &x,const string &y)
{
return (x+y).compare(y+x)<0;
}
int main()
{
vector<string> v;
int a[]={55,31,312,33};
char str[100];
for(int i=0;i<sizeof(a)/sizeof(int);i++)
{
itoa(a[i],str,10);//将整十进制整数转化为字符串存放在str中
v.push_back(str);
}
sort(v.begin(),v.end(),cmp);
for (int k=0;k<v.size();k++)
{
cout<<v[k]<<endl;
}
for(int j=1;j<v.size();j++)
{
v[0].append(v[j]);
}
int result=atoi(v[0].c_str());
cout<<"结果"<<result<<endl;
return 0;
}主要思想:把整数变成字符串,然后插入vector中,使用sort算法排序,自定义排序方式,即可!
法二
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string num;
vector<string> v;
while (cin >> num)
{
v.push_back(num);
}
sort(v.begin(), v.end(), [](const string& s1, const string& s2) -> bool {
return (s1 + s2).compare(s2 + s1) < 0;
});
for_each(v.begin(), v.end(), [](string s) { cout << s; });
cout << endl;
system("pause");
return 0;
}
百度一道笔试题(求n个整数连成一排组成的最小整数)
最新推荐文章于 2021-06-19 11:09:54 发布