Idiot-maker

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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";
    }
}

 

posted on 2015-05-06 20:18  NickyYe  阅读(184)  评论(0编辑  收藏  举报