题目:
解题思路:
想法简单,实现较难
对数组每个首位进行比较,若首位相等就比较第二位,以此类推,对数组进行排序
但是首位相等比较第二位这个实现起来比较困难
这里巧妙的用到了字符串,a,b是两个字符串,对a+b和b+a进行大小比较,可以同样实现功能,这里当然不能直接比较a,b,因为a = "9" , b = "45"
时,a是要排在b前面的,即此时a比b大
代码:
class Solution {
public String largestNumber(int[] nums) {
int len = nums.length;
String[] nums_str = new String[len];
for(int i = 0; i < len; i++){
nums_str[i] = String.valueOf(nums[i]);//转int为String,方便按位比较
}
Arrays.sort(nums_str,new Comparator<String>(){//Arrays.sort()默认从小到大排序,默认x-y,返回正数表示参数x大于参数y,因为要从大到小排,所以要反着来
@Override
public int compare(String x, String y){
if(x.charAt(0) != y.charAt(0)){//首位如果不等的话,直接比较谁的首位大
return y.charAt(0) - x.charAt(0);
}
String sum1 = x + y;
String sum2 = y + x;
return sum2.compareTo(sum1);//按字典顺序比较两个字符串,这里也要反着来
/*
如果此字符串等于此参数字符串,则返回值 0;
如果此字符串小于参数字符串,则返回一个小于 0 的值;
如果此字符串参数字符串,则返回一个大于 0 的值
*/
}
});
StringBuffer ans = new StringBuffer();
if(nums_str[0].charAt(0) == '0'){//字符串的比较不可以直接用 ==
return "0";
}
for(String i : nums_str){
ans.append(i);
}
return ans.toString();
}
}
Tips:
①Arrays.sort()重写比较方法,Arrays.sort()默认从小到大排序,默认x-y,返回正数表示参数x大于参数y,因为本题要从大到小排,所以要反着来
②字符串的比较不可以直接用 ==
实际上字符串的比较有三种方法
a == b 比较的是字符串变量a,b地址是否相等
a.equals(b) 比较的是字符串a,b内容是否相等
a.compareTo(b) 按字典顺序比较两个字符串a,b
如果字符串a 等于字符串b,则返回值 0;
如果字符串a 小于字符串b,则返回一个小于 0 的值;
如果字符串a 大于字符串b,则返回一个大于 0 的值
③字符串String要用双引号""
,字符char要用单引号''