zoukankan      html  css  js  c++  java
  • 剑指Offer32:把数组排成最小的数(Java)

    当提交代码后报“请修改类名为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){//把两个整数按不同顺序拼接起来比较大小,采用拼接后整数更小的拼接顺序。
            Long a=Long.valueOf(arr[i]+""+temp);
            Long b=Long.valueOf(temp+""+arr[i]);//Integer的范围太小需要使用Long型
            if(a<=b)return true;
            else return false;
        }
    }
    
  • 相关阅读:
    安卓反编译
    Icesugar Gourd
    php文件写入
    java 序列化与反序列化
    Toj Dominoes Game
    adb&frida
    Markdown 测试用例
    iview InputNumber类输入框表单验证失效
    01背包问题(回溯算法实现)
    阅读作业二读Lost in CatB有感 by 李栋
  • 原文地址:https://www.cnblogs.com/dongmm031/p/12168890.html
Copyright © 2011-2022 走看看