Given a list of non-negative integers nums
, arrange them such that they form the largest number.
Note: The result may be very large, so you need to return a string instead of an integer.
Example 1:
Input: nums = [10,2] Output: "210"
Example 2:
Input: nums = [3,30,34,5,9] Output: "9534330"
Example 3:
Input: nums = [1] Output: "1"
Example 4:
Input: nums = [10] Output: "10"
Constraints:
1 <= nums.length <= 100
0 <= nums[i] <= 109
最大数。
题意是给一个整数数组,请将他们拼接成字符串,返回数字最大的字符串。
思路是需要自己写一个comparator函数比较每两个数字拼接结果的字典序,举个例子,需要比较到底是210的字典序大还是102的字典序大。这道题没什么算法,考察的是是否能自己实现一个自定义的comparator函数。JavaScript因为没有数据类型的限制的关系,可以直接比较两个数字的大小。
时间O(n^2) - sort函数最坏情况下
空间O(n)
Java实现
1 class Solution { 2 public String largestNumber(int[] nums) { 3 // corner case 4 if (nums == null || nums.length == 0) { 5 return ""; 6 } 7 8 // normal case 9 int n = nums.length; 10 String[] ss = new String[n]; 11 for (int i = 0; i < n; i++) { 12 ss[i] = "" + nums[i]; 13 } 14 Arrays.sort(ss, (a, b) -> { 15 String sa = a + b; 16 String sb = b + a; 17 return sb.compareTo(sa); 18 }); 19 20 StringBuilder sb = new StringBuilder(); 21 for (String s : ss) { 22 sb.append(s); 23 } 24 int len = sb.length(); 25 int k = 0; 26 while (k < len - 1 && sb.charAt(k) == '0') { 27 k++; 28 } 29 return sb.substring(k); 30 } 31 }
JavaScript实现
1 /** 2 * @param {number[]} nums 3 * @return {string} 4 */ 5 var largestNumber = function (nums) { 6 // corner case 7 if (nums.every(n => n === 0)) { 8 return '0'; 9 } 10 11 // normal case 12 nums.sort((n1, n2) => { 13 const s1 = new String(n1); 14 const s2 = new String(n2); 15 const first = s1 + s2; 16 const second = s2 + s1; 17 if (first > second) { 18 return -1; 19 } else if (first < second) { 20 return 1; 21 } else return 0; 22 }); 23 return nums.join(''); 24 };