题目:输入一个正整数数组,把数组里的所有数字拼接起来排成一个数,打印能拼接出的所有数字中的最小的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323
package com.interview; import java.util.Scanner; /* * 数组排列中寻找最小排列的数,把数组排列成最小的数 * */ public class ArrayMin { public int partition(String[] str, int low, int high) { int i = low, j = high; String tmp = str[low]; while (i < j) { while (i < j && compare(str[j], tmp) >= 0) j--; if (i < j && compare(str[j], tmp) < 0) str[i] = str[j]; while (i < j && compare(str[i], tmp) <= 0) i++; if (i < j && compare(str[i], tmp) > 0) str[j] = str[i]; } str[i] = tmp; return i; } public void quickSort(String[] str, int low, int high) { if (low < high) { int mid = partition(str, low, high); quickSort(str, low, mid - 1); quickSort(str, mid + 1, high); } } //compare函数是比较两个字符串大小的函数,规则如下 //例如,"123">"12321","123"<"12345" public int compare(String s1, String s2) { int i = 0; int min = s1.length() < s2.length() ? s1.length() : s2.length(); while (i < min) { if (s1.charAt(i) < s2.charAt(i)) return -1; if (s1.charAt(i) > s2.charAt(i)) return 1; if (s1.charAt(i) == s2.charAt(i)) i++; } if (s1.length() == s2.length()) return 0; else if (s1.length() < s2.length()) return s1.compareTo(s2.substring(min)); else return (s1.substring(min)).compareTo(s2); } public static void main(String[] args) { int n; ArrayMin am = new ArrayMin(); Scanner sc = new Scanner(System.in); System.out.println("请输入数组长度:\n"); n = sc.nextInt(); int[] A = new int[n]; String[] str = new String[n]; System.out.println("请输入数组元素:\n"); for (int i = 0; i < n; ++i) { A[i] = sc.nextInt(); str[i] = String.valueOf(A[i]); } am.quickSort(str, 0, str.length - 1); StringBuilder sb = new StringBuilder(); for (int i = 0; i < str.length; ++i) { // System.out.println(str[i]); sb.append(str[i]); } System.out.println("\n" + sb.toString()); } }
现在我们比较32与321,我们先比较第1位,‘3‘==‘3‘,再比较第2位,‘2‘==‘2‘,此时32已经结束,于是我们重新用32来与321中剩下的1做比较。知道比较除了结果为止。
剑指offer:把数组排成最小的数,布布扣,bubuko.com
原文:http://blog.csdn.net/litianpenghaha/article/details/23938515