剑指offer 46. 把数组排成最小的数

简介: 剑指offer 46. 把数组排成最小的数

题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

例如输入数组 [3,32,321],则打印出这 3 个数字能排成的最小数字 321323。

数据范围

数组长度 [0,500]。

样例

输入:[3, 32, 321]
输出:321323
• 1
• 2
• 3

注意:输出数字的格式为字符串。


方法一:字符串排序 O(nlogn)

这题我们可以发现一个规律,可以通过判断拼接后的字符串的大小来进行排序,假定有字符串 xy


如果 x+y > y+x ,则 x “大于” y ,即 x 排在 y 的后面。

如果 x+y < y+x ,则 x “小于” y ,即 x 排在 y 的前面。

注意: 上述的加法运算并不是实际意义上的整数加法运算,而是字符串的拼接。当然,大于小于也不是整数的大小比较,而是指排序的规则。


例如 x = 3 且 y = 32 ,可以发现:


x + y = 332 > y + x = 323 ,所以我们认为 x “大于” y ,即 x 要排在 y 的后面。

故通过上述规则对数组中的所有字符串进行排序,然后再将排序后的数组中的字符串拼接起来得到的字符串一定是最小的。

class Solution {
public:
    string printMinNumber(vector<int>& nums) {
        vector<string> str;
        for (int i = 0; i < nums.size(); i++)
            str.push_back(to_string(nums[i]));
        sort(str.begin(), str.end(), [](string& x, string& y) {return x + y < y + x; });
        string res;
        for (int i = 0; i < str.size(); i++)
            res += str[i];
        return res;
    }
};


欢迎大家在评论区交流~

目录
相关文章
【剑指offer】-把数组排成最小的数-33/67
【剑指offer】-把数组排成最小的数-33/67
【剑指offer】-最小K个数-28/67
【剑指offer】-最小K个数-28/67
|
2月前
|
Java
每日一题《剑指offer》数组篇之把数组排成最小的数
每日一题《剑指offer》数组篇之把数组排成最小的数
32 0
每日一题《剑指offer》数组篇之把数组排成最小的数
|
2月前
剑指 Offer 45:把数组排成最小的数
剑指 Offer 45:把数组排成最小的数
19 0
|
10月前
剑指offer-10.旋转数组最小的数字
剑指offer-10.旋转数组最小的数字
33 0
剑指offer_数组---把数组排成最小的数
剑指offer_数组---把数组排成最小的数
39 0
剑指offer 41. 最小的k个数
剑指offer 41. 最小的k个数
57 0
每日一题——长度最小的子数组
每日一题——长度最小的子数组
使用二分法解决旋转数组的最小数字的问题
使用二分法解决旋转数组的最小数字的问题
74 0
使用二分法解决旋转数组的最小数字的问题