输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
关键就是制定排序规则。
直接使用比较器Comparator和Arrays.sort即可,我之前的解法是自写排序,笔试没必要又不是面试
链接:https://www.nowcoder.com/questionTerminal/8fecd3f8ba334add803bf2a06af1b993 来源:牛客网 * 解题思路: * 先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则。 * 排序规则如下: * 若ab > ba 则 a > b, * 若ab < ba 则 a < b, * 若ab = ba 则 a = b; * 解释说明: * 比如 "3" < "31"但是 "331" > "313",所以要将二者拼接起来进行比较 public String PrintMinNumber(int [] numbers) { if(numbers == null || numbers.length == 0) return ""; int len = numbers.length; String[] str = new String[len]; StringBuilder sb = new StringBuilder(); for(int i = 0; i < len; i++){ str[i] = String.valueOf(numbers[i]); } Arrays.sort(str,new Comparator<String>(){ @Override public int compare(String s1, String s2) { String c1 = s1 + s2; String c2 = s2 + s1; return c1.compareTo(c2); } }); for(int i = 0; i < len; i++){ sb.append(str[i]); } return sb.toString(); }
利用lambda的简洁解法:
链接:https://www.nowcoder.com/questionTerminal/8fecd3f8ba334add803bf2a06af1b993 来源:牛客网 // 利用lambda的简洁解法 import java.util.*; public class Solution { public String PrintMinNumber(int [] numbers) { String[] strs = new String[numbers.length]; for(int i = 0; i < numbers.length; i++) strs[i] = String.valueOf(numbers[i]); return Arrays.stream(strs) .sorted((x, y) -> (x + y).compareTo(y + x)) .reduce("", (x, y) -> x + y); } }
我的解法:
import java.util.ArrayList; public class Solution { public String PrintMinNumber(int [] numbers) { String[] str = new String[numbers.length]; String temp = null; for(int i=0;i<numbers.length;i++){ str[i] = String.valueOf(numbers[i]); } for(int i=0;i<str.length;i++){ for(int j=i;j<str.length;j++){ if(compare(str[i],str[j])>0){ temp = str[i]; str[i] = str[j]; str[j] = temp; } } } StringBuffer sb = new StringBuffer(); for(int i=0;i<str.length;i++){ sb.append(str[i]); } return sb.toString(); } public int compare(String s1,String s2){ String a = s1+s2; String b = s2+s1; return a.compareTo(b); } }
原文:https://www.cnblogs.com/twoheads/p/11265567.html