179. 最大数

279 阅读2分钟

题目描述

image.png

思路

以[3,30,34,5,9]输出"9534330"为例,

  • 把nums转为string类型的数组arr,然后对它进行降序排序
    • 如果直接用Arrays.sort(),得到的结果是9,5,34,30,3,输出9534303,但是应该得到9534330
    • 所以,30和3,3应该更靠前 排序规则:
  • "30"和"9","309" < "930", 所以9“更大”;"30"和"3","303" < "330",所以3“更大”
  • 这里说的“更大”是指在拼接结果时,应该更靠前。比如99、30、3拼出来的最大数应该是99330,而不是99303
  • 上面的比较大小直接使用string的compare,因为这样可以快速拼接两个数字字符串然后比较

注意点:

  • str = String.valueOf(int)把数字转为字符串
  • str1.compareTo(str2)
    • 如果str1对应的数字大于str2,返回1
    • 如果str1对应的数字小于str2,返回**-1**,相等返回0

代码

class Solution {
    public String largestNumber(int[] nums) {
         //nums转为string数组
        String[] strs = new String[nums.length];
        for (int i = 0; i < nums.length; i++) {
            strs[i] = nums[i] + "";
        }

        Arrays.sort(strs, (a, b) -> {
            String s1 = a + b; // 3 30
            String s2 = b + a; // 30 3
            return s1.compareTo(s2); // 从小到大排
        });

        //特殊处理:输入[0,0] 输出应该为“0”,否则输出“00”
        if (strs[strs.length - 1].equals("0")) {
            return "0";
        }

        // 按照排序拼接结果
        String res = "";
        for (int i = strs.length - 1; i >= 0; i--) {
            res += strs[i];
        }
        return res;
    }
}

class Solution {
    public String largestNumber(int[] nums) {
         //nums转为string数组
        String[] strs = new String[nums.length];
        for (int i = 0; i < nums.length; i++) {
            strs[i] = nums[i] + "";
        }
        sort(strs, 0, nums.length - 1);
        //特殊处理:输入[0,0] 输出应该为“0”,否则输出“00”
        if (strs[strs.length - 1].equals("0")) {
            return "0";
        }
        // 按照排序拼接结果
        String res = "";
        for (int i = strs.length - 1; i >= 0; i--) {
            res += strs[i];
        }
        return res;
    }

    public void sort(String[] strs, int start, int end) {
        int i = start, j = end, pivot = start;
        if (start > end) {
            return;
        }
        while (i != j) {
            // strs[j]比strs[pivot]更大, 3 > 30
            while ((strs[j] + strs[pivot]).compareTo(strs[pivot] + strs[j]) > 0) {// >=0 wrong!
                j--;
            }
            // strs[j]比strs[pivot]更小 30 < 3 
            while (i != j && ((strs[i] + strs[pivot])).compareTo((strs[pivot] + strs[i])) <= 0) {
                i++;
            }
            swap(strs, i, j);
        }
        swap(strs, i, pivot);
        sort(strs, start, i - 1);
        sort(strs, i + 1, end);
    }

    public void swap(String[] strs, int m, int n) {
        String tmp = strs[m];
        strs[m] = strs[n];
        strs[n] = tmp;
    }
}