题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,使其为所有可能的拼接结果中最小的一个。例如输入{3,32,321},则输入321323。
思路:
1.此题需要对数组进行排序,关键点在于排序的规则需要重新定义。我们重新定义“大于”,“小于”,“等于”。如果a,b组成的数字ab的值大于ba,则称a"大于"b,小于与等于类似。
2.比如3与32,因为332大于323,因此我们称3“大于”32。我们按照上述的“大于”,“小于”规则进行升序排列,即可得到题目要求的答案。
基于以上思路,java代码如下:
package chapter5;
import java.util.Arrays;
import java.util.Comparator;
public class P227_SortArrayForMinNumber {
public static class MyComparator1 implements Comparator<Integer> {
@Override
public int compare(Integer a, Integer b) {
return (a +""+ b).compareTo(b +""+ a);
}
}
public static String sortarrayforminnumber1(int[] nums){
if(nums==null||nums.length==0) return "";
Integer[] data = Arrays.stream(nums).boxed().toArray(Integer[]::new);//int[]转Integer[]
Arrays.sort(data,new MyComparator1());
String res="";
for(int i=0;i<data.length;i++){
res+=data[i];
}
return res;
}
public static void main(String[] args) {
System.out.println(sortarrayforminnumber1(new int[]{3,32,321}));
}
}
其中int[]转Integer[]相关的参考了Java中List,Integer,int数组相互转换
补充题目:给定一个字符串类型的数组strs, 找到一种拼接方式, 使得把所有字符串拼起来之后形成的字符串具有最低的字典序。
java参考代码如下:
package chapter5;
import java.util.Arrays;
import java.util.Comparator;
public class P227_SortArrayForMinNumber {
public static class MyComparator implements Comparator<String> {
@Override
public int compare(String a, String b) {
return (a + b).compareTo(b + a);
}
}
public static String sortarrayforminnumber(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;
}
public static void main(String[] args) {
System.out.println(sortarrayforminnumber(new String[]{"b","ba","bb","a"}));
}
}
测试用例:
a.功能测试(输入的数组中有多个数字;输入的数组中数字有重复的数位;输入的数组中只有一个数字)。
b.特殊输入测试(表示数组的指针为nullptr指针)。