我已经为此问题编写了代码:
给定一个非负整数列表,将它们排列成最大数字。
例如,给定[3,30,34,5,9],最大形成数为9534330。
注意:结果可能非常大,因此您需要返回一个字符串而不是一个整数。
我在这段代码中试图实现的目的是首先在最重要的数字上使用基数排序逻辑,然后按递减顺序排列它。后来我正在做第二个最重要的数字,依此类推。我通过传递一对向量来使用std::sort()
函数,其中第一对是值,第二对是索引。以下是我的代码:
bool radixOrder(pair<int,int> p1, pair<int,int> p2)
{
int val1=p1.first;
int e1=p1.second;
int val2=p2.first;
int e2=p2.second;
if(val1==val2 && e1==e2)
{
return val1==val2;
}
else if(((val1/e1)%10) == ((val2/e2)%10))
{
while(val1/e1 == val2/e2)
{
if(e1/10!=0)
e1=e1/10;
if(e2/10!=0)
e2=e2/10;
}
return (val1/e1)%10 > (val2/e2)%10;
}
else
{
return (val1/e1)%10 > (val2/e2)%10;
}
}
vector<pair<int,int> > createVNew(vector<int>& v)
{
vector<pair<int,int> > temp;
for(int i=0; i<v.size(); i++)
{
cout << i << endl;
int val=v[i], e=1;
if(v[i]==0)
{
temp.push_back(make_pair(val, 1));
}
else
{
while((e/v[i])==0)
e*=10;
if(e!=v[i])
{
temp.push_back(make_pair(val,e/10));
}
else if(e==v[i])
{
temp.push_back(make_pair(val,e));
}
}
}
return temp;
}
string largestNumber(vector<int>& v)
{
int e=1;
vector< pair<int,int> > vnew=createVNew(v);
sort(vnew.begin(), vnew.end(), radixOrder);
stringstream s;
for(int i=0; i<vnew.size(); i++)
{
s<<vnew[i].first;
}
return s.str();
}
largestNumber(..)
是我的函数,它返回所需的字符串。现在这个代码适用于我可以尝试的大多数非零输入。但是当输入是0的长向量时,类似于:
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0]
它给出了浮点异常。
我试过找到解决方案,但还是没能。我是cpp的初学者,任何帮助都会很棒。
答案 0 :(得分:3)
您的radixSort
函数违反了Compare
requirements,即反身性(即radixOrder(x, x)
必须返回false
,但它会返回true
,因为执行会转到第一个if
分支)。
所以你在这里得到一个未定义行为的经典例子。我相信这段代码应该以某种方式重写,如
if (e1==e2)
{
return val1 > val2;
}
但是,我只是通过将输入数字按相反的顺序排序为字符串来解决问题。