题目:把数组排成最小的数
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: "102"
示例 2:
输入: [3,30,34,5,9]
输出: "3033459"
提示:
0 < nums.length <= 100
说明:
输出结果可能非常大,所以你需要返回一个字符串而不是整数 拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
思路分析
昨天笔试时候遇到个类似的题,被坑了,今天就得来填坑。
其实这个题思路很简单,提取题目中关键信息:
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
提取出关键字后自己整合一下思路,将数组中数字拼接成一个最小的数字,返回为字符串。
说到最小的数字,肯定就会想到排序,既然题目中没说给的数组是有序的,那就可以以我们所需要的方式进行排序。比如数组中有两个元素,10、2、只需要两个元素以正反的顺序进行字符串拼接加起来,然后转换成数字进行比较就可以比较出大小。
比如 102 和 210 ,很明 102 小,那就是说 10 在前 2 在后,这样顺序就出来了。
AC 代码
/**
* @param {number[]} nums
* @return {string}
*/
var minNumber = function (nums) {
// 浅拷贝一份数组
let ns = nums.slice()
// 两元素字符串相加取最小值
ns.sort((a, b) => {
let str1 = a + '' + b
let str2 = b + '' + a
return parseInt(str1) > parseInt(str2) ? 1 : -1
})
return ns.join('')
};
总结
时间复杂度:O(n) 空间复杂度:O(n)
思路总结:将数组进行排序,按照规则 两数字以字符串形式相加转换成数字值最小的方式 进行排序,排序之后进行拼接,返回就是答案。
如有错误之处,还请指正。