美文网首页
《剑指offer》(三十二)--把数组排成最小的数(java)

《剑指offer》(三十二)--把数组排成最小的数(java)

作者: 鼠小倩 | 来源:发表于2020-02-07 17:24 被阅读0次

考点:时间效率、数组

题目描述

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

代码格式

import java.util.ArrayList;
public class Solution {
    public String PrintMinNumber(int [] numbers) {

    }
}

解题一-先拼接再排序

1.思路
(1)数组{s1,s2},当比较两个字符串s1, s2大小的时候,先将它们拼接起来;
(2)比较s1+s2,和s2+s1那个大,如果s1+s2大,那说明s2应该放前面,所以按这个规则,s2就应该排在s1前面。
2.代码

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 sum1 = Integer.valueOf(numbers[i]+""+numbers[j]);
                int sum2 = Integer.valueOf(numbers[j]+""+numbers[i]);
                //0然后比较两个数组的大小
                if(sum1 > sum2){
                    int temp = numbers[j];
                    numbers[j] = numbers[i];
                    numbers[i] = temp;
                }
            }
        }
        //定义一个字符串
        String str = new String("");
        for(int i=0; i < numbers.length; i++)
            //最后转化为字符串
            str = str + numbers[i];
        return str;
    }
}

解题二-转化为字符串数组

1.思路
将整型数组转为字符串数组后排好序然后连接起来
2.代码

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Solution {
    public String PrintMinNumber(int [] numbers) {
        ArrayList<String> result = new ArrayList<>();
        for(int i : numbers){
            result.add( i + "" );
        }
 
        Collections.sort(result, new Comparator<String>() {
 
            public int compare(String o1, String o2) {
                int i = 0, j = 0;
                while(i < o1.length() || j < o2.length()){
                    if(j==o2.length()) j-=o2.length();
                    if(i==o1.length()) i-=o1.length();
                    if(o1.charAt(i) < o2.charAt(j)){
                        return -1;
                    }else if(o1.charAt(i) > o2.charAt(j)){
                        return 1;
                    }
                    i++; j++;
                }
                return 0;
            }
        });
 
        StringBuilder stringBuilder2 = new StringBuilder();
        for(String s : result){
            stringBuilder2.append(s);
        }
        return stringBuilder2.toString();
    }
}

1.对于String或Integer这些已经实现Comparable接口的类来说,可以直接使用Collections.sort方法传入list参数来实现默认方式(正序)排序;
2.如果不想使用默认方式(正序)排序,可以通过Collections.sort传入第二个参数类型为Comparator来自定义排序规则;
3.如果想使用Collections.sort的方式一进行排序,可以通过实现Comparable接口的compareTo方法来进行,如果不实现,则参考第2点;
4.jdk1.8的Comparator接口有很多新增方法,其中有个reversed()方法比较实用,是用来切换正序和逆序的,

参考:https://www.nowcoder.com/questionTerminal/8fecd3f8ba334add803bf2a06af1b993?answerType=1&f=discussion

相关文章

网友评论

      本文标题:《剑指offer》(三十二)--把数组排成最小的数(java)

      本文链接:https://www.haomeiwen.com/subject/vlabxhtx.html