剑指 Offer -- 把数组排成最小的数(三十二)

把数组排成最小的数(三十二)

题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

代码(已在牛客上 AC)

详见注释.

class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        string res;
        std::sort(numbers.begin(), numbers.end(), Comp());
        for (auto &d : numbers)
            res += to_string(d);
        return res;
    }
private:
    // 这道题的关键是找到一种排序方式, 使得 numbers 中的元素从左向右
    // 组合最小, 假设现在将 numbers 中的数字都转换为字符串了, 如果按照
    // 字典顺序排列的话, 无法得到最小值, 比如 "32" 与 "322", 按照字典排序
    // "32" 在 "322" 前面, 但是 "32322" 要比 "32232" 更大, 从这个例子可以看出,
    // 排序方式应该以 s1 与 s2 连接起来的结果: (s1 + s2) 与 (s2 + s1) 作为
    // 排序的指标.
    struct Comp {
        bool operator()(int &i, int &j) {
            string s1 = to_string(i), s2 = to_string(j);
            return (s1 + s2) < (s2 + s1);
        }
    };
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值