持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
题目(Largest Number)
链接:https://leetcode-cn.com/problems/largest-number
解决数:1226
通过率:41.2%
标签:贪心 字符串 排序
相关公司:amazon microsoft bytedance
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入: nums = [10,2]
输出: "210"
示例 2:
输入: nums = [3,30,34,5,9]
输出: "9534330"
提示:
1 <= nums.length <= 1000 <= nums[i] <= 109
思路
两个元素 x 和 y,如果 (x 拼接 y) > (y 拼接 x),那么就让 x 排到 y 的前面。 根据这个排序思想,可以有两个方法 方法一:数学计算法: 比如:int x = 12; int y = 345 x 拼接 y = 12345 = 12 * 1000 + 345 = x * 1000 + y; y 拼接 x = 34512 = 345 * 100 + 12 = y * 100 + x; 上面的1000是哪里来的?因为y是3位数。上面的100是哪里来的?因为x是2位数;明白这个思想就能写出代码了 方法二:String 比如:String x = "12"; String y = "345"; x 拼接 y = "12345" = x + y; y 拼接 x = "34512" = y + x; 因为数字在ASCII码表中是有顺序的,所以利用String的compareTo()方法,可以进行自然顺序的排序。 注意 关于[0,0]这个测试用例,因为我们做的是倒序排序,如果排序后的第一个元素是0,那后面的元素肯定小于或等于0,结合题目提示”0 <= nums[i] <= 109“; 所以判断排序后的数组第一个元素为0,就 return "0" 即可。 本文是用:快排+String
var largestNumber = function(nums) {
quickSort(nums,0,nums.length-1)
return nums[0] == '0'?'0':nums.join('')
};
function quickSort(nums,start,end){
if(start>=end)return
var index = start
var pivot = nums[start]
for(let i = start+1;i<=end;i++){
if(nums[i]+''+pivot>pivot+''+nums[i]){
index++
swap(nums,index,i)
}
}
swap(nums,index,start)
quickSort(nums,start,index-1)
quickSort(nums,index+1,end)
}
function swap(nums,l,r){
var temp = nums[l]
nums[l] = nums[r]
nums[r] = temp
}