把数组排成最小的数 |刷题打卡

86 阅读1分钟

题目:把数组排成最小的数

剑指 Offer 45. 把数组排成最小的数

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

 

示例 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)

思路总结:将数组进行排序,按照规则 两数字以字符串形式相加转换成数字值最小的方式 进行排序,排序之后进行拼接,返回就是答案。

如有错误之处,还请指正。