0

我为这个问题写了一个代码:

给定一个非负整数列表,将它们排列成最大的数。

例如,给定 [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的初学者,任何帮助都会很棒。

4

1 回答 1

3

您的radixSort函数违反了Compare要求,即非自反性(即radixOrder(x, x)必须返回falsetrue由于执行转到第一个if分支而返回)。

所以你在这里得到了一个未定义行为的经典例子。我相信那段代码应该以某种方式重写

if (e1==e2)
{
    return val1 > val2;
}

不过,我只需将输入数字按相反的顺序排序为字符串即可解决问题。

于 2015-06-15T09:15:55.843 回答