记录 1 道算法题
最大数
179. 最大数 - 力扣(LeetCode) (leetcode-cn.com)
要求:提供一个数组,将里面的数字做字符串拼接,不可以拆数字,可以调换数字的位置,返回拼接出来最大的字符串。
比如: [10,2]
, 输出: '210'
其实只要做到局部最优,把开头大的数字放到最前面,那么拼出来的数一定是最大的,比如把 9 开头的放在第一位,那么就是最大的。
所以排序的时候要从每一个数字的左边第一位开始比较,将大的放前面,如果相等则比较第二位,以此类推,将最大的放在前面。但是这样的比较很复杂,有很多种情况,因为数字的位数不一样。
这时可以使用一个简单的办法,也是局部最优的思想,只要将数字做两种拼接,一种是自己在前面,一种是自己在后面。这样就可以比较出大小,只要将大的结果往前放,总体就是最大的。
另外还要处理 [0,0] 的情况,我们可以做一种假设,如果出现了 0,毫无疑问在比较中会把 0 放到后面,因为他在前面的拼接结果更小,所以在这种情况下,0 是不可能出现在排序后的数组的第一位。如果有,说明都是 0。比如 [9,0,8,2,0]
,明显 0 会聚集在后面 '98200'
。
完整代码如下:
function largestNumber(nums) {
// sort 会反着传入参数
const compare = (a, b) => {
// 如果后面的数是 0,不做交换
if (a == '0') return 1
// 如果前面的数是 0,做交换
else if (b == '0') return -1
// 比较两种拼接方式
return Number(b + a) - Number(a + b)
}
// 排序
nums.sort((a,b) => compare(String(a), String(b))
// 排序后第一位出现 0 的情况
if (nums[0] == 0) {
return '0'
}
// 正常情况输出字符串
return nums.join('')
}