leetcode_179:最大数

这个题目我是想到了使用自定义排序,而且要注意的是,我们是比较数字的字符串形式,因为这样容易直接从数字的高位开始比较。我们仔细想能找出构造最大数的规律:

  1. 如果两个数字的位数相同,我们只需要那个最大的在前面,较小的再后面就可以了。
  2. 如果两个数字位数不同,那么就要从头开始比较,哪个高位大,哪个就在前面,一直到最后。
  3. 如果到了最后还没有比较出来(比如说345和3456),那么就要看较长数字的后面和开头数字一一进行比较…

当然难就难在了最后一点上,到底如何比较两个不等长,而且前面的位都是一样的情况。我想了半天情况也没有想出来,然后看了一下答案。什么????原来是这样,原来我记得有一道题就是使用这种思路,也忘记是哪个了,其实就是直接将两个字符串按不同顺序加起来,然后判断这两个加起来的就好了。

比如说刚才说的345和3456,那直接比较3453456和3456345两个字符串就可以了,我们认为的较大的肯定是在前面的。这样就不用考虑第3种情况的所有可能了,简单暴力。好了直接上代码:

    public String largestNumber(int[] nums) {
        String[] temp = new String[nums.length];	//存放所有数字的字符串形式
        for (int i = 0; i < nums.length; ++i) {
            temp[i] = Integer.toString(nums[i]);
        }
        Arrays.sort(temp, (x, y) -> {
        	//两个数字位数相同,直接返回两者差值,此处我们是升序排列
            if (x.length() == y.length())	
                return Integer.valueOf(y) - Integer.valueOf(x);
            String x1 = x + y;
            String x2 = y + x;
            return x2.compareTo(x1);	//否则比较他们的拼接,如果y“大于”x,那么x2一定大于x1的
        });
        //最后得到结果
        StringBuilder sb = new StringBuilder();
        for (String str : temp)
            sb.append(str);
        //有可能里面全是0
        if (sb.charAt(0) == '0')
            return "0";
        return sb.toString();
    }
发布了96 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/reachwang/article/details/103587105