题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323。
理论基础:数组排列后拼接的数字最小,则内部任意两个拼接的数字最小。因此,只需要比较数组中任意两个的大小。
思路:外部采用快排(logn),进行比较;内部的比较采用 (str1+str2) ? (str2+str1)。
标答:
public String MinNumber(int[] nums) { List<Integer> list = new ArrayList<Integer>(); for (int i=0; i<nums.length; i++) list.add(nums[i]); Collections.sort(list, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { // TODO Auto-generated method stub String s12 = "" + o1 + o2; String s21 = "" + o2 + o1; return s12.compareTo(s21); } }); String res = ""; for (int n : list) res += n; return res; }答二:
public String MinNumber(int[] nums) { String[] s = new String[nums.length]; for (int i=0; i < nums.length; i++) { s[i] = "" + nums[i]; } s = helpMinNumberQuickSort(s, 0, s.length-1); String res = ""; for (int j=0; j<s.length; j++) res += s[j]; return res; } // 快排 public String[] helpMinNumberQuickSort(String[] s, int start, int end) { int i = start, j = end; String key = s[start]; while (i != j) { if (!helpQuickSortCompare(key, s[j]) && i<j) j--; s[i] = s[j]; if (helpQuickSortCompare(key, s[j]) && i<j) i++; s[j] = s[i]; } s[i] = key; if (i-1 > start) helpMinNumberQuickSort(s, start, i-1); if (j+1 < end) helpMinNumberQuickSort(s, j+1, end); return s; } // 快排中比较两个str大小,根据正反连接后的str大小比较 public boolean helpQuickSortCompare(String str1, String str2) { String ss12 = str1 + str2; String ss21 = str2 + str1; System.out.println(str1 +" " + str2 +" " +ss12.compareTo(ss21)); if (ss12.compareTo(ss21) >= 0) return true; else return false; }参考:https://blog.csdn.net/gg543012991/article/details/52601195