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();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值