184. 最大数

184. 最大数
 

给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数。
样例

Example 1:

Input:[1, 20, 23, 4, 8]
Output:"8423201"

Example 2:

Input:[4, 6, 65]
Output:"6654"

挑战

在 O(nlogn) 的时间复杂度内完成。
注意事项

最后的结果可能很大,所以我们返回一个字符串来代替这个整数。

 

  bool compare(const string &str1, const string &str2)
{

int size1 = str1.size();
    int size2 = str2.size();

 

    if (size1 == size2)
    {
        return str1 > str2;
    }

    if (size1 > size2)
    {
        string tmp = str2;
        int num = size1 - size2;
        while (num)
        {
            tmp.append(std::string(1,str2[size2 - 1]));
            num--;
        }
        return str1 >= tmp;
    }
    else
    {
        string tmp = str1;
        int num = size2 - size1;
        while (num)
        {
            tmp.append( std::string(1,str1[size1 - 1]) );
            num--;
        }
        return tmp >= str2;
    }

}

void quickSort(vector<string> &tmpVec, int start, int end)
{
    if (start >= end)
    {
        return;
    }
    

    int left = start;
    int right = end;
    string tmpStr1 = tmpVec[right];

    while (left < right)
    {
        //从左向右找小数
        while (left < right && ( compare(tmpVec[left], tmpStr1) || tmpVec[left] == tmpStr1) )
        {
            left++;
        }
        if (left < right  &&  compare(tmpStr1,tmpVec[left]))
        {
            tmpVec[right] = tmpVec[left];
            right--;
        }

        //从右向左找大数
        while (left < right && (compare(tmpStr1, tmpVec[right]) || tmpVec[right] == tmpStr1))
        {
            right--;
        }

        if (left < right && compare( tmpVec[right], tmpStr1))
        {
            tmpVec[left] = tmpVec[right];
            left++;
        }
    }
    tmpVec[left] = tmpStr1;
    quickSort(tmpVec, start, left-1);
    quickSort(tmpVec,left+1,end);

}

string largestNumber(vector<int> &nums) {
    // write your code here
    vector<string> tmpVec;
    for (auto it : nums)
    {
        tmpVec.push_back(std::to_string(it));
    }
    quickSort(tmpVec, 0, tmpVec.size()-1);
    string ret;

    for (auto it : tmpVec)
    {
        ret.append(it);
    }
    
    if(ret[0] == '0')
    {
        return "0";
    }
    
    return ret;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值