leetcode----179. Largest Number

链接:

https://leetcode.com/problems/largest-number/

大意:

给定一个整型数组nums,nums中每个元素都是非负数。要求对nums中各个元素进行一个组合,使得该组合后的数是所有组合得到的结果中最大的。例子:

思路:

可以使用基于交换的冒泡排序算法,记录字符串 s1 = "" + nums[i] + nums[i + 1],s2 = "" + nums[i + 1] + nums[i]。如果s2比s1大,则需要交换nums[i]和nums[i + 1]的位置。

最后,先判断nums[0]的数字大小:如果是0,则直接返回"0"。否则依次将nums中的元素append到StringBuilder对象sb中,最后返回sb.toString()。

代码:

class Solution {
    public String largestNumber(int[] nums) {
        boolean end = false; //标志冒泡排序是否提前结束
        // 基于冒泡排序
        for (int i = 0; i < nums.length; i++) {
            end = true;
            for (int j = 0; j < nums.length - i - 1; j++) {
                String s1 = "" + nums[j] + nums[j + 1], s2 = "" + nums[j + 1] + nums[j];
                // 只有当s2比s1大时 才交换两个字符串位置
                if (s1.compareTo(s2) < 0) {
                    end = false;
                    int t = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = t;
                }
            }
            if (end)
                break;
        }
        // 如果经过排序后的第一个数字是0 那么直接返回"0"
        if (nums[0] == 0)
            return "0";
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < nums.length; i++) {
            sb.append(nums[i]);
        }
        return sb.toString();
    }
}

结果:

结论:

效率有点低,可能是冒泡排序效率低的原因。想了下,为什么不直接用内置的排序函数?(基于快排实现的)。需要改进。。

改进:

class Solution {
    public String largestNumber(int[] nums) {
        // 将基本数据类型转为引用数据类型  Comparator不支持自定义基本数据类型排序
        Integer[] numss = new Integer[nums.length];
        for (int i = 0; i < nums.length; i++) {
            numss[i] = nums[i];
        }
        // 使用内置排序Arrays.sort(nums) 基于快速排序
        Arrays.sort(numss, new Comparator<Integer>(){
            public int compare(Integer i1, Integer i2) {
                String s1 = "" + i1 + i2, s2 = "" + i2 + i1;
                return s2.compareTo(s1);
            }
        });
        // 如果经过排序后的第一个数字是0 那么直接返回"0"
        if (numss[0] == 0)
            return "0";
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < numss.length; i++) {
            sb.append(numss[i]);
        }
        return sb.toString();
    }
}

 

 

 

猜你喜欢

转载自blog.csdn.net/smart_ferry/article/details/89485985
今日推荐