Largest Number

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

Given a list of non negative integers, arrange them such that they form the largest number.

For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.

Note: The result may be very large, so you need to return a string instead of an integer.

解题思路:

这题目似乎比较难,难处在于一眼可以看出思路,但是无法写出解法。所谓talk is cheap, show me the code。

感觉很像基数排序,但是确实从低位补齐,即把低位和高位对比。网友说,用Comparetor,一语点开天机。这个问题无非就是一个将nums排序的问题,然后将结果按顺序contact,输出。

问题是,如何定义两个数字的大小关系呢?开始考虑按位对比,但是比想象的要复杂。比如321和32,323和32。后来发现,两个数字的组合,就两种可能,S1S2或者S2S1,直接比较大小不就可以了?

还有个问题,当所有数字都是0的时候,不要输出00,而是0。

public class Solution {

    public class Compare implements Comparator<String>{

        public int compare(String s1, String s2){

            // int i = 0, j = 0;

            // while(i < s1.length() && j < s2.length() && s1.charAt(i) == s2.charAt(j)) {

            //     if(i != s1.length() - 1) {

            //         i++;

            //     }

            //     if(j != s2.length() - 1) {

            //         j++;

            //     }

            //     if(i == s1.length() - 1 && j == s2.length() - 1) {

            //         return s1.charAt(i) - s2.charAt(j);

            //     }

            // }

            // return s1.charAt(i) - s2.charAt(j);

            String new1 = s1 + s2;

            String new2 = s2 + s1;

            for(int i = 0; i < new1.length(); i++) {

                if(new1.charAt(i) != new2.charAt(i)) {

                    return new1.charAt(i) - new2.charAt(i);

                }

            }

            return 0;

        }

    }

    

    public String largestNumber(int[] nums) {

        if(nums.length == 0) {

            return new String("0");

        }

        String result = "";

        String[] numsStr = new String[nums.length];

        for(int i = 0; i < nums.length; i++) {

            numsStr[i] = String.valueOf(nums[i]);

        }

        Arrays.sort(numsStr, new Compare());

        for(int i = numsStr.length - 1; i >= 0; i--) {

            result += numsStr[i];

        }

        //如果是[0,0]就返回0,而不是00

        for(int i = 0; i < nums.length; i++) {

            if(nums[i] != 0) {

                return result;

            }

        }

        return "0";

    }

}

自己实现一个类去实现comparetor接口,重写它的compare方法,在Merge k Sorted Lists 和 Merge Intervals 都用到过。也可以override String的compareTo方法,不过这里不好用。

这道题的总结就是,要透过题目的意思去看本质。本题实际上就是将元素按照某种规则去排序,而不是平常意义上的大小。那么这个规则就可以用一个new compare()来定义。

update 2015/06/04:

public class Solution {

    public class Compare implements Comparator<String> {

        public int compare(String n1, String n2) {

            String res1 = n1 + n2;

            String res2 = n2 + n1;

            return res1.compareTo(res2);

        }

    }

    public String largestNumber(int[] nums) {

        String res = "";

        String[] nums_str = new String[nums.length];

        for(int i = 0; i < nums.length; i++) {

            nums_str[i] = String.valueOf(nums[i]);

        }

        Arrays.sort(nums_str, new Compare());

        for(int i = nums_str.length - 1; i >= 0; i--) {

            res = res + String.valueOf(nums_str[i]);

        }

        for(int i = 0; i < nums.length; i++) {

            if(nums[i] != 0) {

                return res;

            }

        }

        return "0";

    }

}

 

你可能感兴趣的:(number)