推荐

完整《剑指Offer》算法题解析系列请点击 👉 《剑指Offer》全解析 Java 版

题目描述

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

import java.util.ArrayList;

public class Solution {
   
    public String PrintMinNumber(int [] numbers) {
   

    }
}

思路:

自定义一个比较大小的函数,比较两个字符串s1, s2大小的时候,先将它们拼接起来,比较s1+s2,和s2+s1那个大,如果s1+s2大,那说明s2应该放前面,所以按这个规则,s2就应该排在s1前面

实现:

public class TestBlock {
   
    public String PrintMinNumber(int [] numbers) {
   
        String s = "";
        ArrayList<Integer> list = new ArrayList<Integer>();

        //将数组中的数字添加到集合中
        for (int num : numbers) {
   
            list.add(num);
        }
        //自定义比较器,并将集合中的值用这个比较强排序,自定义比较器可以用 lambda表达式写。
        Collections.sort(list, new Comparator<Integer>() {
   
            @Override
            public int compare(Integer str1, Integer str2) {
   
                String s1 = str1 + "" + str2;
                String s2 = str2 + "" + str1;
                return s1.compareTo(s2);
            }
        });
        //将排完序的数组遍历拼接起来
        for (int j : list) {
   
            s += j;
        }
        return s;
    }
}

附录:

关于比较器的升序和降序问题

//关于比较器的升序和降序
Collections.sort(list, new Comparator<String>() {
   
      public int compare(String str1, String str2) {
   

      /**       * 升序排的话就是: 第一个参数.compareTo(第二个参数);       * 降序排的话就是: 第二个参数.compareTo(第一个参数);       */

      // 升序
      // return str1.compareTo(str2);
      
          // 降序
      return str2.compareTo(str1);
     
    }

看完之后,如果还有什么不懂的,可以在评论区留言,会及时回答更新。

这里是猿兄,为你分享程序员的世界。

非常感谢各位大佬们能看到这里,如果觉得文章还不错的话, 求点赞👍 求关注💗 求分享👬求评论📝 这些对猿兄来说真的 非常有用!!!

注: 如果猿兄这篇博客有任何错误和建议,欢迎大家留言,不胜感激!