本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述:
原题链接 ? 179. 最大数
给定一组非负整数 nums
,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2]
输出:"210"
复制代码
示例 2:
输入:nums = [3,30,34,5,9]
输出:"9534330"
复制代码
示例 3:
输入:nums = [1]
输出:"1"
复制代码
示例 4:
输入:nums = [10]
输出:"10"
复制代码
注意:
1 <= nums.length <= 100
0 <= nums[i] <= 109
二、思路分析:
思路1:
借助js中数组自带的sort方法,重新编写sort方法。
参数:
compareFunction
可选用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的各个字符的Unicode位点进行排序。
firstEl
第一个用于比较的元素。
secondEl
第二个用于比较的元素。
返回值:
排序后的数组。请注意,数组已原地排序,并且不进行复制。
如果没有指明 compareFunction
,那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序。
如果指明了 compareFunction
,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:
-
如果
compareFunction(a, b)
小于 0 ,那么 a 会被排列到 b 之前; -
如果
compareFunction(a, b)
等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本); -
如果
compareFunction(a, b)
大于 0 , b 会被排列到 a 之前。 -
compareFunction(a, b)
必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。
为了更加深入理解数组的sort方法的实现,我借助快排实现了个sort函数:
function sort(arr, compareFunction) {
if (arr.length <= 1) return arr
let start = 0,
end = arr.length - 1,
current = arr[start]
while (start < end) {
while (compareFunction(arr[end], current) > 0 && end > start) {
end--
}
if (end == start) break
arr[start] = arr[end]
start++
while (compareFunction(arr[start], current) < 0 && end > start) {
start++
}
if (end == start) break
arr[end] = arr[start]
end--
}
arr[start] = current
let left = arr.slice(0, start)
let right = arr.slice(start + 1)
return [
...sort(left, compareFunction),
current,
...sort(right, compareFunction),
]
}
复制代码
三、完整代码:
思路1:
function solve(nums) {
if (nums.join('') === new Array(nums.length).fill(0).join('')) return '0'
nums = nums.map((one) => (one = one + ''))
sort(nums, (a, b) => {
let len1 = a.length,
len2 = b.length,
temp = ''
if (len1 !== len2) {
if (len1 > len2) {
temp = a.slice(0, len2)
if (temp == b && a[len2 - 1] > a[len2]) {
return a - b
}
} else if (len1 < len2) {
temp = b.slice(0, len1)
if (temp == a && b[len1 - 1] > b[len1]) {
return a - b
}
}
}
return b > a ? 1 : -1
})
return nums.join('')
}
复制代码