给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。
示例 1:
#输入: [10,2]
#输出: 210
示例 2:
#输入: [3,30,34,5,9]
#输出: 9534330
说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。
初始思路,看到这个可以想到JavaScript的Array sort API,默认就是字典排序,但是看到示例二就会发现跟字典排序又不太一样,所以我们需要自定义排序函数。
错误的自定义排序函数思路:
- 字典排序,如果开始的第一个数字不一样,那么就直接返回排序结果
- 如果两个开始的某一连续部分数字一样,则遍历他们,直到末尾或者到达不一样的部分
- 如果直到末尾他们的部分也都一样,则返回-1或者1都可以,他们的相对位置变动不会造成影响
- 如果数字1先到达末尾,则与自身比较,如果数字2先到达末尾,则与自身比较
代码实现
/**
* @param {number[]} nums
* @return {string}
*/
var largestNumber = function(nums) {
let sum = nums.reduce((a, b) => a+b)
if (sum === 0) {
return '0'
}
nums.sort((a, b) => {
let num1 = a + ""
let num2 = b + ""
let char1 = num1[0]
let char2 = num2[0]
let i = 0
let l1 = num1.length
let l2 = num2.length
while (char1 === char2) {
if (!num1[i] && !num2[i]) {
break
}
if (i >= l1) {
// return num2[0] < num2[i] ? 1 : -1
return compare(num2, i)
}
if (i >= l2) {
// return num1[0] >= num1[i] ? 1 : -1
return compare1(num1, i)
}
char1 = num1[i]
char2 = num2[i]
i++
}
return char1 > char2 ? -1 : 1
})
return nums.join('')
};
function compare(str, i) {
let j = 0
let l = str.length - 1
while (i < l && str[j] === str[i]) {
j++
i++
}
return str[j] < str[i] ? 1 : -1
}
function compare1(str, i) {
let j = 0
let l = str.length - 1
while (i < l && str[j] === str[i]) {
j++
i++
}
return str[j] >= str[i] ? 1 : -1
}
但是,值得注意的是,这个代码实现并没有AC,具体的错误原因在第四步的具体实现。
于是,看了评论区,有了下面代码的巧妙实现
/**
* @param {number[]} nums
* @return {string}
*/
var largestNumber = function(nums) {
let sum = nums.reduce((a, b) => a+b)
if (sum === 0) {
return '0'
}
nums.sort((a, b) => {
let num1 = a + ""
let num2 = b + ""
return Number(num1+num2) < Number(num2+num1) ? 1 : -1
})
return nums.join('')
};
这里的实现主要是想到比较 num1 + num2 和 num2 + num1的思路
总结:算法题感觉一段时间不做就会生疏好多,感觉自己要加强练习和理解原理