题目详情:
输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如
输入数组[3,32,321],则打印出这三个数字能排成的最小数字为321323。
1.输出结果可能非常大,所以你需要返回一个字符串而不是整数
2.拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
解题思路:
将数组转换为字符串数组。
自定义排序方法,比较两个字符串 str1 和 str2 的拼接结果 str1+str2 和 str2+str1 的大小。
如果 str1+str2 < str2+str1,则 str1 排在 str2 前面。
如果 str1+str2 > str2+str1,则 str2 排在 str1 前面。
如果 str1+str2 = str2+str1,则 str1 和 str2 相对位置不变。
使用自定义的排序方法对字符串数组进行排序。
将排序后的字符串按顺序拼接起来,得到的结果即为能拼接出的所有数字中最小的一个。
代码实现:
function minNumber(numbers) {
// 将数组转换为字符串数组
const strArr = numbers.map(num => num.toString());
// 自定义排序方法
strArr.sort((a, b) => {
const str1 = a + b;
const str2 = b + a;
if (str1 < str2) {
return -1;
} else if (str1 > str2) {
return 1;
} else {
return 0;
}
});
// 拼接排序后的字符串
return strArr.join('');
}
// 测试示例
console.log(minNumber([3, 32, 321])); // 输出: "321323"