一、题目
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
二、思路
要想组成最大的整数,一种直观的想法是把数值大的数放在高位。
于是我们可以比较输入数组的每个元素的最高位,最高位相同的时候比较次高位,以此类推,完成排序,然后把它们拼接起来。这种排序方式对于输入数组 没有相同数字开头 的时候是有效的;
三、实现
function largestNum(nums){
nums.sort((x,y)=>{
let sx = 10, sy = 10;
while(sx<=x){ //记录放到数字x前,需要左移多少
sx *= 10;
}
while(sy<=y){ //记录放到数字y前,需要左移多少
sy *= 10;
}
// y放到x前组成的数字 - x放到y前组成的数字
return (sx*y+x) - (sy*x+y)
})
if(nums[0]===0){
return "0";
}
return nums.join("");
}
let arr = [3,30,34,5,19]
console.log(largestNum(arr)); //53433019
四、补充:数组的sort方法
- sort() 方法可以接受一个方法f为参数 。方法f有两个参数,分别代表每次排序比较时的两个数组项;
- sort()排序时每两个数组项比较都会执行这个参数;
- 当函数返回值为1的时候就交换两个数组项的顺序,否则就不交换。
let arr = [3,1,4,2,6]
arr.sort((x,y)=>{
if(x>y){
return -1;
}
if(x<y){
return 1;
}
})
1)默认是升序排序
var arrA = [ 6 , 2 , 4 , 3 , 5 , 1 ];
arrA.sort();
document.writeln(arrA);
// 结果是:1,2,3,4,5,6