美文网首页
把数组排成最小的数(剑指offer 面试题33)

把数组排成最小的数(剑指offer 面试题33)

作者: 抬头挺胸才算活着 | 来源:发表于2020-03-08 12:24 被阅读0次

    题目:输入数组{3,32,321},得到321323

    思路:
    首先想到的是全部的排列有n!个,可以在排列的时候进行剪枝。
    但这更像一个排序问题,对于数组中的两个数m和n,排列可以得到mn和nm,如果mn小,那么m需要排在n前面,反之依然(这个是需要证明的)。同时还需要考虑大数的问题,我们刚好可以利用字符串来解决大数问题,mn和nm的比较也刚好可以用字符串的比较来解决。

    ConcatenateNumber 类

    import java.util.Arrays;
    
    public class ConcatenateNumber implements Comparable<ConcatenateNumber>{
        private int num;
        private String string;
    
        public ConcatenateNumber(int num) {
            this.num = num;
            this.string = String.valueOf(num);
        }
    
        public String getString() {
            return string;
        }
    
        @Override
        public int compareTo(ConcatenateNumber cn) {
            String string1 = this.string + cn.getString();
            String string2 = cn.getString() + this.string;
            return string1.compareTo(string2);
        }
    
        @Override
        public String toString() {
            return string;
        }
    
        public static int getMinConcatenatedNumber(int[] nums){
            ConcatenateNumber[] cns = new ConcatenateNumber[nums.length];
    
            for (int i = 0; i < nums.length; i++) {
                cns[i] = new ConcatenateNumber(nums[i]);
            }
    
            Arrays.sort(cns);
            String numAsString = "";
            for (ConcatenateNumber cn : cns) {
                numAsString += cn.toString();
            }
            return Integer.valueOf(numAsString);
        }
    }
    

    测试代码

            int[] nums = new int[]{3,32,321};
            int concatenateNum = ConcatenateNumber.getMinConcatenatedNumber(nums);
            System.out.println(concatenateNum);
    

    相关文章

      网友评论

          本文标题:把数组排成最小的数(剑指offer 面试题33)

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