最大数

题目:

思路:

【1】核心点在于怎么理顺对数组进行排序,这差不多就是要针对两个元素进行两两组合,然后按组合的大小进行排序。可以理解为:把两个字符串,两两交换位置之后拼接,再比较基于字符串中每个字符的Unicode值的大小。

代码展示:

基于原生的排序函数进行处理:

class Solution {
    public String largestNumber(int[] nums) {
        int len=nums.length;
        String[] strings=new String[len];
        for (int i = 0; i <len ; i++) {
            strings[i]=String.valueOf(nums[i]);
        }
        Arrays.sort(strings, (o1, o2) -> o2.concat(o1).compareTo(o1.concat(o2)));
        if (strings[0].equals("0"))
           return String.valueOf(0);
        StringBuilder sb=new StringBuilder();
        for (String s:strings) {
            sb.append(s);
        }
        return sb.toString();
    }
}

如果不给用函数的话,那就基于优先队列进行比较:

class Solution {
    public String largestNumber(int[] nums) {
        PriorityQueue<String> heap = new PriorityQueue<>((x, y) -> (y + x).compareTo(x + y));
        for(int x: nums) heap.offer(String.valueOf(x));
        String res = "";
        while(heap.size() > 0) res += heap.poll();
        if(res.charAt(0) == '0') return "0";
        return res;
    }
}

当然还有更高级基于Java流操作的代码:

class Solution {
    public String largestNumber(int[] nums) {
        String res = Arrays.stream(nums)
            .mapToObj(String::valueOf)
            .sorted((s1, s2) -> (s2 + s1).compareTo(s1 + s2))
            .reduce("", (a , b) -> (a + b));
        return res.charAt(0) == '0' ? "0" : res;
    }
}

 

posted @ 2023-01-05 23:54  忧愁的chafry  阅读(25)  评论(0编辑  收藏  举报