剑指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;
    }
};


欢迎大家在评论区交流~

目录
相关文章
|
Windows
无法识别的标志“-Ot”(在“p2”中)
无法识别的标志“-Ot”(在“p2”中)
651 0
|
安全 Python Windows
[笔记]逆向工具IDA Pro之简单使用
[笔记]逆向工具IDA Pro之简单使用
3882 0
|
小程序 定位技术
uniapp微信小程序地图全屏显示配送范围
uniapp微信小程序地图全屏显示配送范围
462 1
|
IDE Java 编译器
Java“找不到符号” 错误怎么查找解决
“找不到符号”是Java编程中常见的编译错误,通常表明代码试图访问未声明或不可见的符号(如类、方法或变量)。解决此问题需检查拼写、导入包是否正确及作用域是否合适。确保使用正确的类路径和库,可有效避免此类错误。若问题依旧,查阅官方文档或使用调试工具定位错误亦为良策。
7152 10
|
机器学习/深度学习 自然语言处理 监控
自然语言处理(Natural Language Processing, NLP)中的情感分析
自然语言处理(Natural Language Processing, NLP)中的情感分析
1121 3
|
JavaScript 前端开发
JavaScript if...Else 语句
JavaScript if...Else 语句
183 0
|
Linux
Linux线程同步(try锁和读写锁)
Linux线程同步(try锁和读写锁)
295 0
|
机器学习/深度学习 文字识别 算法
通用文字识别OCR 之实现数字化教材
通用文字识别OCR 之实现数字化教材
476 0
通用文字识别OCR 之实现数字化教材
|
机器学习/深度学习 人工智能 并行计算
|
安全 网络协议 JavaScript
网络安全实验九 恶意代码实验
网络安全实验九 恶意代码实验
559 0