最大数
题目:
思路:
【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; } }