题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
分类:数组,字符串
解法1:将数组重新排序,然后拼接就可以了,排序的方式可以使用快速排序
比较的原则是321<3
341>3等
分类:数组,字符串
解法1:将数组重新排序,然后拼接就可以了,排序的方式可以使用快速排序
比较的原则是321<3
341>3等
- import java.util.ArrayList;
- public class Solution {
- public String PrintMinNumber(int [] numbers) {
- solve(numbers, 0, numbers.length-1);
- StringBuilder sb = new StringBuilder(numbers.length);
- for(int i=0;i<numbers.length;i++){
- sb.append(numbers[i]);
- }
- return sb.toString();
- }
- public void solve(int [] numbers,int low,int high){
- if(low<high){
- int mid = partition(numbers,low,high);
- solve(numbers, low, mid-1);
- solve(numbers, mid+1, high);
- }
- }
- public boolean compare(int x,int y){
- int count1 = 0;
- int x1 = x;
- while(x1!=0){
- count1++;
- x1/=10;
- }
- int[] arr1 = new int[count1];
- create(x,arr1);
- int count2 = 0;
- int x2 = y;
- while(x2!=0){
- count2++;
- x2/=10;
- }
- int[] arr2 = new int[count2];
- create(y,arr2);
- int i=0;
- while(i<count1&&i<count2){
- if(arr1[i]<arr2[i]) return true;
- else if(arr1[i]>arr2[i]) return false;
- i++;
- }
- if(i==count1){
- int t = arr1[count1-1];
- while(i<count2&&t==arr2[i]){
- i++;
- }
- if(i==count2 || t<arr2[i]){
- return true;
- }else{
- return false;
- }
- }
- if(i==count2){
- int t = arr2[count2-1];
- while(i<count1&&t==arr1[i]){
- i++;
- }
- if(i==count1 || t<arr1[i]){
- return false;
- }else{
- return true;
- }
- }
- return false;
- }
- public void create(int x,int[] arr){
- int i = arr.length-1;
- while(x!=0){
- arr[i] = x%10;
- x/=10;
- i--;
- }
- }
- public int partition(int [] array,int low,int high){
- int temp = array[low];
- while(low<high){
- while(low<high && compare(temp,array[high])){
- high--;
- }
- array[low] = array[high];
- while(low<high && compare(array[low],temp)){
- low++;
- }
- array[high] = array[low];
- }
- array[low] = temp;
- return low;
- }
- }
原文链接 http://blog.youkuaiyun.com/crazy__chen/article/details/45009813