179. 最大数
问题
给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。
需要去掉前导0
例子
思路
考虑使用排序法则【要输出最大的值】:(10,2)->210-102
因为可能数字要大于Integer.MAX_VALUE,所以使用字符串比较
代码
class Solution {
public String largestNumber(int[] nums) {
// List<String> list = new ArrayList<>();
// for(int n:nums)
// list.add(String.valueOf(n));
// list.sort((s1,s2)->{
// String s = s1+s2;
// String ss=s2+s1;
// return ss.compareTo(s);
// });
// StringBuilder sb = new StringBuilder();
// for(String s:list)
// sb.append(s);
// if(sb.charAt(0)=='0') return "0";
// return sb.toString();
String[] arr=new String[nums.length];
for(int i=0; i<nums.length; i++)
arr[i]=String.valueOf(nums[i]);
Arrays.sort(arr, (s1,s2)->{
String s=s1+s2;
String ss=s2+s1;
//使用Integer比较可能会超过最大长度,所以采用字符串比较
// return Integer.valueOf(ss)-Integer.valueOf(s);
return ss.compareTo(s);
});
String res = String.join("", arr);
//如果第一个是0,则肯定后面都是0,因为res是最大的
if(res.charAt(0)=='0') return "0";
return res;
}
}
面试题45. 把数组排成最小的数
不用处理前导0
class Solution {
public String minNumber(int[] nums) {
List<String> list = new ArrayList<>();
for(int n : nums) list.add(String.valueOf(n));
list.sort((s1,s2)->{
String s = s1+s2;
String ss = s2+s1;
return s.compareTo(ss);
});
StringBuilder sb = new StringBuilder();
for(String s : list) sb.append(s);
return sb.toString();
}
}