2.组成最大数——华子机考必知必会

308 阅读1分钟

题目描述

小组中每位都有一张卡片,卡片上是6位内的正整数,将卡片连起来可以组成多种数字,计算组成的最大数字。

","号分割的多个正整数字符串,不需要考虑非数字异常情况,小组最多25个人。

  • 输入
  • 4589,101,41425,9999
  • 输出
  • 9999458941425101

题解

先对分割出来的字符串做排序,排序规则为两组元素组合时值最大的,则排在前面。

方法一 Comparator比较器

    public static void main(String[] args) {
        String input = "4589,101,41425,9999";
        String output = findLargestNumber(input);
        System.out.println(output);
    }
     /**
     * 寻找最大值
     * @param input
     * @return
     */
    private static String findLargestNumber(String input) {
        String[] cards = input.split(",");
        Arrays.sort(cards, new LargestNumberComparator());

        StringBuilder result = new StringBuilder();
        for (String card : cards) {
            result.append(card);
        }

        return result.toString();
    }
    /**
     * 最大值比较器
     */
    private static class LargestNumberComparator implements Comparator<String> {
        @Override
        public int compare(String a, String b) {
            String option1 = a + b;
            String option2 = b + a;
            return option2.compareTo(option1);
        }
    }

方法二 Lambda表达式


    public static void main(String[] args) {
        String input = "4589,101,41425,9999";
        String output = findLargestNumber(input);
        System.out.println(output);
    }

    private static String findLargestNumber(String input) {
        String[] cards = input.split(",");
        Arrays.sort(cards, (a, b) -> {
            String option1 = a + b;
            String option2 = b + a;
            return option2.compareTo(option1);
        });

        StringBuilder result = new StringBuilder();
        for (String card : cards) {
            result.append(card);
        }
        return result.toString();
    }