最大的数
题意
给定一个非负整数列表,将它们排列为最大的数字。
范例1:
输入: [10,2]
输出: “210"
范例2:
输入: [3,30,34,5,9]
输出: “9534330"
解题思路
此题本人一看脑海中就想到了贪心法先介绍一下字典序
就是说,将多个字符串的同一位置的字符按照26个字母的顺序进行比对。a最小,b最大。
a < b;
abc >acb; 因为第二位置上,前面字符串是b,后面字符串是c,所以是小于关系,以此类推
这道题也是 102<210 以为第一个数2大于1以此类推。有了字典序的概念就可以写代码了。遍历数组把数加入一个堆中这里的堆需要自定义一个比较器默认的是小根堆。
大根堆
public static class MyCompator implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
String str1=String.valueOf(o1)+String.valueOf(o2);
String str2=String.valueOf(o2)+String.valueOf(o1);
return -str1.compareTo(str2);
}
}
代码解析
public String largestNumber(int[] nums) {
Integer[] arr=new Integer[nums.length];
for (int i = 0; i < nums.length; i++) {
arr[i]=nums[i];
}
if (nums.length==0 || nums==null) return null;
String res="";
//排序
Arrays.sort(arr,new MyCompator());
if (arr[0].equals(0)){ //如果最大值是0的话直接return
return "0";
}
for (int i = 0; i < arr.length; i++) {
res+=arr[i];
}
return res;
}
类似的题目
给定一个字符串数组求出把数组中的字符串结合起来最小的字符串。
思路也是一样使用堆来实现还是贪心法
这里就不做过多的解释了认真看懂了前面的题目这道题也自然懂了
代码解析
public static class MyComparator implements Comparator<String> {
@Override
public int compare(String a, String b) {
return (a + b).compareTo(b + a);
}
}
public static String lowestString(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
Arrays.sort(strs, new MyComparator());
String res = "";
for (int i = 0; i < strs.length; i++) {
res += strs[i];
}
return res;
}