题目
给定一组非负整数 nums
,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
输入: nums = [10,2] 输出: "210"
题解
第一种
我们先声明一个largestNumber
函数,在函数接受一个参数 a
,这个参数是一个数组,如果没有传入参数,默认为一个空数组。 然后在函数中我们将数组 a
中的每个元素都转换成字符串,这是因为后面排序时需要将元素转换为字符串类型。我们这里使用 map()
方法进行遍历数组中的每个元素,它的返回值是一个新的数组,我们在用参数a
进行接收下,新数组中的每个元素都是原数组中的对应元素经过处理后的结果。 然后,使用冒泡排序算法对数组进行排序。重复地遍历数组,每次比较相邻两个元素,如果前面的元素大于后面的元素,则交换它们的位置,直到数组完全排序。 最后,如果数组中最大的数是 0,那么返回字符串 "0",否则将排序后的数组元素连接成一个字符串并返回。 函数中的 bubbleSort()
函数用于实现冒泡排序,它接受一个数组作为参数,使用双重循环遍历数组,每次比较相邻的两个元素,如果前一个元素比后一个元素大,则交换它们的位置。循环结束后,数组就完成了排序
var largestNumber = function (a) { a = a || []; a = a.map(function (item) { return '' + item; }); bubbleSort(a); if (a[0] == '0') { return '0'; } return a.join(''); } function bubbleSort(arr) { var temp; var len = arr.length; var i, j; for (i = 0; i < len - 1; i++) { for (j = 0; j < len - 1 - i; j++) { if ((arr[j] + arr[j + 1]) < (arr[j + 1] + arr[j])) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }
第二种
我们这里将两个数字转为字符串相加,再将相加后的字符串转为数字返回。由于sort()
默认是按升序排序,所以这里返回的是b
和a
的组合减去a和b的组合,这样在数组排序后就能得到从大到小排列的数组,最后判断如果第一个数字是0,则说明数组中所有数字都是0,返回字符串"0",否则将数组拼接成一个字符串返回
var largestNumber = function (nums) { nums.sort((a, b) => { return ('' + b + a) - ('' + a + b) }) return nums[0] ? nums.join("") : "0" };