179. Largest Number
1. 题目描述
题目链接
Given a list of non negative integers, arrange them such that they form the largest number.
Given a list of non negative integers, arrange them such that they form the largest number.
Example 1:
Input: [10,2]
Output: “210”
Example 2:
Input: [3,30,34,5,9]
Output: “9534330”
Note: The result may be very large, so you need to return a string instead of an integer.
2. 题目分析
将所给的数字排列组合,找到最大值。即只要将数字“从大到小”排序,注意不是简单的从大到小。
3. 解决思路
把m和n拼接成的mn和nm按照字符串大小的比较规则来处理即可。如果mn < nm,应该打印出nm,即n应该排在m前面,反之,m应该排在n前面。
要使用自定义比较规则进行 排序,最好的方法是,通过把规则放到实现接口Comparator中的compare()方法中,然后调用Collections.sort()进行排序。
这题我最后遇到一个问题简直把自己蠢哭了,就是,leetcode有事例如[0,0,0]这种获得结果我没有优化,直接输出"000",然后我就想着怎么把前面的0给去掉,想了一种方法:
boolean flag = true;
for (int i = 0; i < len; i++) {
if (i == 0 && list.get(i).equals("0")){
continue;
}else{
str.append(list.get(i));
}
}
终于吧前面该死的0去掉了,开开心心commit后,又没通过,发现只输出了 “” 空字符串,,,
行,我结果加个判断可以吧,return str.length() == 0 ? “0” : str.toString()。
commit后,哇,终于acc了,我都佩服我自己了,然后看看自己的运行分析,只超过65%的人,难道人家又更高级的方法,赶紧瞧瞧。
悄咪咪的看了一个超过90%的代码,发现了惊人的秘密,跟我的思路基本一样,唯一不同的是,他一行解决了前面是0的问题????
if (list.get(0).equals("0")){
return "0";
}
我真的被自己蠢哭了,高手在民间啊!!!!
*4. 代码实现(java)
package com.algorithm.leetcode.sort;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* Created by 凌 on 2019/1/5.
* 描述:
*/
public class LargestNumber {
public static void main(String[] args) {
// int[] nums = {10,2};
int[] nums = {3,30,34,5,9};
// int[] nums = {128,12};
// int[] nums = {121,12};
// int[] nums = {0,0,0};
// int[] nums = {0};
String result = largestNumber(nums);
System.out.println(result);
}
public static String largestNumber(int[] nums) {
if (nums == null || nums.length == 0){
return "";
}
StringBuilder str = new StringBuilder();
int len = nums.length;
List<String> list = new ArrayList<>(len);
for (int i = 0; i < len; i++) {
list.add(String.valueOf(nums[i]));
}
Collections.sort(list,new StringCompator());
//判断全是0的情况
if (list.get(0).equals("0")){
return "0";
}
for (int i = 0; i < len; i++) {
str.append(list.get(i));
}
return str.toString();
}
}
class StringCompator implements Comparator<String> {
@Override
public int compare(String str1, String str2) {
String str1AndStr2 = str1+str2;
String str2AndStr1 = str2+str1;
return str2AndStr1.compareTo(str1AndStr2);
}
}