zoukankan      html  css  js  c++  java
  • 把数组排成最小的数

    题目描述

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

    bool compSizeDif(const string& l, const string& r) {
        string tr = r.substr(0, l.size());
        int c = l.compare(tr);
        if (0 == c) {
            //如果相等,看大数的后(m-n)位;如果m-n<=n,直接比较小数和大数的后n位,小的在前,否则大数截取后m-n位,继续第2步
            if (r.size() - l.size() <= l.size()) {
                return l < r.substr(r.size() - l.size());
            } else {
                return compSizeDif(l, r.substr(l.size()));
            }
        }
        //位数不同,先比较小数(n位)和大数(m位)的前n位,小的在前,
        return c < 0;
    }
    
    bool compare(const string& l, const string& r)
    {
        if (l.size() == r.size()) {//位数相同小的在前
            return l < r;
        } else if (l.size() < r.size()){
            return compSizeDif(l, r);
        } else {
            return !compSizeDif(r, l);
        }
    }
    class Solution {
    public:
        string PrintMinNumber(vector<int> numbers) {
            //1.位数相同小的在前
            //2.位数不同,先比较小数(n位)和大数(m位)的前n位,小的在前,
            //如果相等,看大数的后(m-n)位;如果m-n<=n,直接比较小数和大数的后n位,小的在前,否则大数截取后m-n位,继续第2步
            vector<string> strs;
            for (auto num : numbers) {
                strs.push_back(to_string(num));
            }
            sort(strs.begin(), strs.end(), compare);
            string ans;
            for (auto str : strs) {
                ans += str;
            }
            return ans;
        }
    };
    
  • 相关阅读:
    touch
    ls
    Linux基础
    errors
    strconv
    strings
    fmt
    os/exec
    笔记本连不上网怎么办
    笔记本连不上网怎么办
  • 原文地址:https://www.cnblogs.com/jecyhw/p/6586734.html
Copyright © 2011-2022 走看看