您的位置:首页 > 编程语言 > Java开发

Leetcode 179(Java)

2017-04-02 15:52 274 查看
题目如下: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.

首先要确定原来对于数组的排序方式这道题肯定是行不通的,那么新的排序方式应该是这样:排序时应当先比较最高位,若最高位相同,则比较下一位,值得注意的是,在前几位数字都相同的情况下,谁的尾巴短,谁排在前面。例如330和33:高两位数字都相同,但33是个二位数,那么它就比330要有优势了。而真正落到代码的实现,其实只需要比较33033和33330谁大就可以了,AC代码如下:

public class Solution {
public String largestNumber(int[] nums) {
String num[] = new String[nums.length];
if(nums==null||nums.length==0){
return "";
}
for(int i=0;i<nums.length;i++){
num[i] = String.valueOf(nums[i]);
}

Comparator<String> compr = new Comparator<String>(){
public int compare(String m,String n){
String s1 = m+n;
String s2 = n+m;

return s2.compareTo(s1);
}
};

Arrays.sort(num,compr);

if(num[0].charAt(0)=='0'){
return "0";
}
StringBuilder rs = new StringBuilder();
for(String x:num){
rs.append(x);
}

return rs.toString();
}
}


BTW,写代码的时候脑子卡在了compare后结果的升序降序问题上了,通过查找资料明白了,在这里写出来给和我一样原本不太理解的人一个参考。首先要明确的是:Arrays.sort(T[] a, Comparator<> c)这个方法是默认升序排列的。也就是说当我们compare(x,y)>1在说明x>y的同时也意味着sort后y将排在x的前面。对于这道题我们可以带入两个数值x=11,y=20。此时s1=1120,s2=2011,注意我们的返回值是s2.compareTo(s1)即返回1,那么根据我们的规则11是“大于”20的,再根据默认的升序规则,20将排在11的后面。就这样把升序巧妙的转换为了降序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: