【LeetCode】Largest Number 解题报告

时间:2021-01-29 02:42:03

【LeetCode】Largest Number 解题报告

标签(空格分隔): LeetCode


题目地址:https://leetcode.com/problems/largest-number/#/description

题目描述:

Given a list of non negative integers, arrange them such that they form the largest number.

For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.

Note: The result may be very large, so you need to return a string instead of an integer.

Ways

题目意思是对数字进行重排拼接组成最大数字。
首先我想到的就是对每个数字的第一位进行排序,然后如果有第二位再对第二位排序等等。如果纯int操作的话,因为数字的位数不同,这样做会很麻烦。所以我想到了转换成String再比较。
如果是直接比较字符串a,b的大小,也是不可以的。比如a="30",b="3",直接字符串比较结果为a>b组成"303",而目标的是b>a组成"330"。因此最终想到比较的是a+bb+a
对于上面的列子,a+b="303",b+a="330",可以看出b+a>a+b(a+b).compareTo(b+a)返回的是负,而对于sort(),返回负是从小到大排序,不合题意。故应该是(b+a).compareTo(a+b),这样是从大到小排序。
排序之后把所有结果拼接组成一个字符串即可。最后要注意的问题是可能出现[0,0]这样的输入,结果是"00",因此,如果最终结果的首位是'0',那么应该修改输出的结果为"0".

public class Solution {
public String largestNumber(int[] nums) {
String[] s = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
s[i] = Integer.toString(nums[i]);
}
Arrays.sort(s, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return (b + a).compareTo(a + b);
}
});
StringBuilder ans = new StringBuilder();
for (String temp : s) {
ans.append(temp);
}
if (ans.charAt(0) == '0') {
ans = new StringBuilder("0");
}
return ans.toString();
}
}

Date

2017 年 4 月 5 日