给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。 示例 1: 输入: [10,2] 输出: 210 示例 2: 输入: [3,30,34,5,9] 输出: 9534330 说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。
题解:
class Solution { public String largestNumber(int[] nums) { // 排序,从大到小 quickSort(nums, 0, nums.length - 1); // 打印 StringBuilder sb = new StringBuilder(); for (int n : nums) { if (sb.length() == 1 && sb.toString().equals("0") && n == 0) { continue; } sb.append(n); } return sb.toString(); } private void quickSort(int[] nums, int start, int end) { if (start > end) { return; } int left = start; int right = end; int temp = nums[left]; while (left != right) { // 右边节点走 while (compare(nums[right], temp) <= 0 && left < right) { right --; } // 左边节点走 while (compare(nums[left], temp) >= 0 && left < right) { left ++; } // 左右交换 if (left < right) { int t = nums[left]; nums[left] = nums[right]; nums[right] = t; } } // 最终将基准数归位 nums[start] = nums[left]; nums[left] = temp; // 左右递归继续排序 quickSort(nums, start, left - 1); quickSort(nums, left + 1, end); } // left>right 1 // left=right 0 // left<right -1 private Integer compare(int left, int right) { String leftStr = String.valueOf(left); String rightStr = String.valueOf(right); Long sum1 = Long.valueOf(leftStr + rightStr); Long sum2 = Long.valueOf(rightStr + leftStr); if (sum1 > sum2) { return 1; } else if (Objects.equals(sum1, sum2)) { return 0; } else { return -1; } // int i = 0; // while (true) { // if (i >= leftStr.length() && i >= rightStr.length()) { // return 0; // } // if (i >= leftStr.length()) { // return -1; // } // if (i >= rightStr.length()) { // return 1; // } // // int ret = leftStr.charAt(i) - rightStr.charAt(i); // if (ret > 0) { // return 1; // } else if (ret < 0){ // return -1; // } // // i++; // } } }
分析:
1.核心是快排,并且修改快排的比较大小逻辑
2.一开始想岔了,比较大小的逻辑写得很复杂(注释那里),后面看了题解改了策略。