【leetcode】179.(Medium)Largest Number
解题思路
重写Collections.sort()中的compare方法,规则为:
有两个字符串s1=“12”、s2=“34”,由于3412>1234,所以令s2+s1>s1+s2
提交代码
class Solution{
public String largestNumber(int[] nums) {
// 将int数组改为String数组,方便后面进行比较
List<String> list=new ArrayList<String>();
for(int num : nums)
list.add(String.valueOf(num));
// 使用Collections.sort()对数组进行排序,排序规则为两个字符串相加后的
// 结果比较。这里是逆序排序
Collections.sort(list,new Comparator<String>() {
@Override
public int compare(String s1,String s2) {
return Long.parseLong(s1+s2)>Long.parseLong(s2+s1)?-1:1;
}
});
// 将排序后的结果串起来
StringBuilder sbuilder=new StringBuilder();
for(String s :list)
sbuilder.append(s);
// 剃掉前面的0
while(sbuilder.charAt(0)=='0'&&sbuilder.length()>1)
sbuilder.delete(0,1);
return sbuilder.toString();
}
}
1、首先将int型的数组改为String型的数组,因为改为String类型更方便两个数字进行拼接和比较
2、使用Comparator比较器接口,重载compare方法
3、使用StringBuilder将数组中的结果串起来
4、剃掉前面的0
运行结果:
评论区重载Comparator比较器接口的代码看起来很优雅:
Collections.sort(list,(a,b) -> (int)(Long.parseLong(b+a) - Long.parseLong(a+b)) );
一行就写完了。。。
然后剔除字符串前面的0他是这么写的:
return sb.toString().replaceFirst("^0+(?!$)", "");
也是一行就写完了。。。