剑指Offer做题笔记(5)把数组排成最小的数

当提交代码后报“请修改类名为Main” 建议重置,否则正确的代码也会报数组越界之类的错误。至于为什么会出现我是没搞懂,不过重置之后变成刚开始做题的样子就好了。

参考文献:
https://www.nowcoder.com/questionTerminal/8fecd3f8ba334add803bf2a06af1b993?f=discussion https://blog.csdn.net/fanzitao/article/details/7895344
https://www.cnblogs.com/learnapi/p/9003112.html

题目描述

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

在看了牛客网上的解答后存在以下两种解体方式

方法一:转成整型的ArrayList,利用Collections.sort自定义比较方式进行排序。

Collections.sort有两种类型:

  1. 对于String或Integer这些已经实现Comparable接口的类来说,可以直接使用Collections.sort方法传入list参数来实现默认方式(正序)排序。
  2. 对于自定义类型,或者自定义排序方式,可以通过实现Comparable接口的compareTo方法来进行。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Solution {
    public String PrintMinNumber(int [] numbers) {
     StringBuilder s =new StringBuilder("");
        ArrayList<Integer> inlist=new ArrayList<Integer>();
        for (int i=0;i<numbers.length;i++){
            inlist.add(numbers[i]);
        }
        Collections.sort(inlist,new Comparator<Integer>(){
            public int compare(Integer s1,Integer s2){
                String str1=s1+""+s2;
                String str2=s2+""+s1;
                return str1.compareTo(str2);
            }
        });
        for(int i:inlist){
        s.append(i);}
        String a=s.toString();
        return a;//return String a=s.toString();是错误的写法
    }
}

方法二:比较整数的先后顺序,可以把两个整数a1,a2按照不同的顺序拼接起来,比较a1+a2,a2+a1两个整数哪个小,若a1+a2拼接成的整数小则把a1放到a2的前面。按照这个思路把整个数组排一遍序,整个数组拼接起来的整数将是最小的整数。

关键点:排序;比较两个整数拼接后的大小,然后返回值小的拼接顺序

import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
    public static String PrintMinNumber(int [] numbers) {//调用方法,遍历排序后的数组拼接字符串返回结果。
        quicksort(numbers,0,numbers.length-1);
        int i=0;
        String str="";
        while(i<numbers.length)
            str+=numbers[i++];
        return str;
    }
    public static void quicksort(int []arr,int begin,int end){//快速排序
        if(begin>=end)
            return;//
        int index=sort(arr,begin,end);
        quicksort(arr,begin,index-1);
        quicksort(arr,index+1,end);
    }
    public static int sort(int[]arr,int start,int end){//快速排序
        int temp=arr[start];
        int i=start;
        int j=end;
        while(i!=j){
            while(i<j&&!judge(arr,j,temp))
                j--;
            while(i<j&&judge(arr,i,temp))
                i++;
            if(i<j){
                int tem=arr[i];
                arr[i]=arr[j];
                arr[j]=tem;
            }
        }
        arr[start]=arr[i];
        arr[i]=temp;
        return i;
    }
    public static boolean judge(int []arr,int i,int temp){//把两个整数按不同顺序拼接起来比较大小,采用拼接后整数更小的拼接顺序。
        Double a=Double.parseDouble(arr[i]+""+temp);
        Double b=Double.parseDouble(temp+""+arr[i]);//
        if(a<=b)return true;
        else return false;
    }
}

猜你喜欢

转载自www.cnblogs.com/dongmm031/p/12168890.html