【剑指offer】把数组排成最小的数

一、题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

二、思路分析及代码实现

方法一:暴力法

将数组中元素的全排列情况放入list中,然后根据list中的字符串的排序情况输出最小的排列情况即可。

import java.util.*;
  public class Solution {
  ArrayList<String> list=new ArrayList<>();
  String str="";
  public String PrintMinNumber(int [] numbers) {
    //把数组中的元素进行全排列,然后输出全排列中最小的那个
    if(numbers.length==0)
      return str;
    getFullpermutation(numbers,0,numbers.length);
    Collections.sort(list);
    return list.get(0);
    
  }
  public void getFullpermutation(int[] array, int start, int end){
    if(end<0)
      return;
    if(start==end){
      ArrtoStr(array);
    }else{
      for(int i=start;i<end;i++){
        swap(array,i,start);
        getFullpermutation(array,start+1,end);
        swap(array,start,i);
      }
    }
  }
  public void swap(int[] array, int i, int j){
    int ch=array[i];
    array[i]=array[j];
    array[j]=ch;
  }
  public void ArrtoStr(int[] array){
    String str="";
    for(int i=0;i<array.length;i++)
      str=str+Integer.valueOf(array[i]);
    if(!list.contains(str))
      list.add(str);
  }
}

方法二:字符串拼接大小关系判断

解题关键:比较两个字符串s1, s2大小的时候,先将它们拼接起来,比较s1+s2,和s2+s1那个大,如果s1+s2大,那说明s2应该放前面,所以按这个规则,s2就应该排在s1前面。

import java.util.ArrayList;
public class Solution {
    public String PrintMinNumber(int [] numbers) {
      if(numbers==null||numbers.length==0)
        return "";
      for(int i=0;i<numbers.length;i++){
        for(int j=i+1;j<numbers.length;j++){
          int a=Integer.valueOf(numbers[i]+""+numbers[j]);
          int b=Integer.valueOf(numbers[j]+""+numbers[i]);
          if(a>b){
            int temp=numbers[i];
            numbers[i]=numbers[j];
            numbers[j]=temp;
          }
      }
      }
      String str="";
      for(int i=0;i<numbers.length;i++){
        str=str+Integer.valueOf(numbers[i]);
      }
      return str;
    }
}

你可能感兴趣的:(剑指offer,JAVA,字符串)