zoukankan      html  css  js  c++  java
  • 把数组排成最小的数

    题目描述

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

    思路一

    要输出数组的最小排列,那么可以将该数组能够组成的所有排列都列举出来,然后依次比较找出最小排列值;但是n个元素就有n!个全排列数,并且还需要找最小值,这个时间复杂度明显很大。

    思路二

    该思路不用去找该数组可以组成多少个全排列,而是直接对该数组进行排序,而这里的排序不是简单的根据数组中的元素大小排序,而是我们自定义一个排序规则:根据拼接后的字符串的大小进行排序,如果对于整数m 和整数n,如果mn < nm ,那么我们就设定n应该排序在m的前面

        int n;
            String s = "";
            ArrayList<Integer> list = new ArrayList<Integer>();
            n = numbers.length;
            for(int i = 0; i < n; i ++){
                list.add(numbers[i]);
            }
            Collections.sort(list, new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    String s1 = o1 + "" + o2;//将整数转为字符串
                    String s2 = o2 + "" + o2;
                    //小于0:s1<s2  大于0:s1 > s2  等于0:s1=s2(升序排列)
                    //将两个int类型的数拼接为字符串的形式进行比较可以防止溢出(隐形的大数问题)
                    return s1.compareTo(s2);//虽然比较的拼接的字符串大小,但是最后还是根据字符串的大小来对数组的元素进行排序,只不过我们只是参照字符串的比较这个标准来进行排序的,而不是简单的升序或者降序排列
                }
            });
    		//拼接字符串
            for(int j:list){								//foreach语句
                s += j;
            }
            return s;
    
    • 注意如果这里return s2.compareTo(s1),那么最终就是按照最大排列进行比较了,最后返回的就是降序排列的数组

    • 这里借助了

      public static <T> void sort(List<T> list, Comparator<? super T> c) {
          list.sort(c);
      }
      

    自己构建一个Comparator,自定义排序方法

    把数组排成最小的数

    剑指offer-把数组排成最小的数(Java)

    剑指offer—把数组排成最小的数

    https://www.jianshu.com/p/18846ddae75a

    https://www.jianshu.com/p/94c9c91aee4d

    《算法导论》第三版

  • 相关阅读:
    服务器的小程序,可以通过浏览器访问该服务器自定义的内容
    GUI小程序---理解GUI
    迷你MyBank
    使用Scanner输入数据-读取文本数据
    文件拷贝代码模型
    File文件操作类
    链表
    ThreadLocal类使用理解
    二叉树
    比较器比较对象数组Comparable和Comparator区别
  • 原文地址:https://www.cnblogs.com/flyingcr/p/10698550.html
Copyright © 2011-2022 走看看