179. Largest Number

179. Largest Number

1. 题目描述
题目链接

Given a list of non negative integers, arrange them such that they form the largest number.
Given a list of non negative integers, arrange them such that they form the largest number.
Example 1:
Input: [10,2]
Output: “210”
Example 2:
Input: [3,30,34,5,9]
Output: “9534330”
Note: The result may be very large, so you need to return a string instead of an integer.

2. 题目分析
将所给的数字排列组合,找到最大值。即只要将数字“从大到小”排序,注意不是简单的从大到小。

3. 解决思路
把m和n拼接成的mn和nm按照字符串大小的比较规则来处理即可。如果mn < nm,应该打印出nm,即n应该排在m前面,反之,m应该排在n前面。
要使用自定义比较规则进行 排序,最好的方法是,通过把规则放到实现接口Comparator中的compare()方法中,然后调用Collections.sort()进行排序。
这题我最后遇到一个问题简直把自己蠢哭了,就是,leetcode有事例如[0,0,0]这种获得结果我没有优化,直接输出"000",然后我就想着怎么把前面的0给去掉,想了一种方法:

        boolean flag = true;
        for (int i = 0; i < len; i++) {
            if (i == 0 && list.get(i).equals("0")){
                continue;
            }else{
                str.append(list.get(i));
            }
        }

终于吧前面该死的0去掉了,开开心心commit后,又没通过,发现只输出了 “” 空字符串,,,
行,我结果加个判断可以吧,return str.length() == 0 ? “0” : str.toString()。
commit后,哇,终于acc了,我都佩服我自己了,然后看看自己的运行分析,只超过65%的人,难道人家又更高级的方法,赶紧瞧瞧。
悄咪咪的看了一个超过90%的代码,发现了惊人的秘密,跟我的思路基本一样,唯一不同的是,他一行解决了前面是0的问题????

        if (list.get(0).equals("0")){
            return "0";
        }

我真的被自己蠢哭了,高手在民间啊!!!!

*4. 代码实现(java)

package com.algorithm.leetcode.sort;


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * Created by 凌 on 2019/1/5.
 * 描述:
 */
public class LargestNumber {
    public static void main(String[] args) {
//        int[] nums = {10,2};
        int[] nums = {3,30,34,5,9};
//        int[] nums = {128,12};
//        int[] nums = {121,12};
//        int[] nums = {0,0,0};
//        int[] nums = {0};
        String result = largestNumber(nums);
        System.out.println(result);
    }
    public static String largestNumber(int[] nums) {
        if (nums == null || nums.length == 0){
            return "";
        }
        StringBuilder str = new StringBuilder();
        int len = nums.length;
        List<String> list = new ArrayList<>(len);

        for (int i = 0; i < len; i++) {
            list.add(String.valueOf(nums[i]));
        }
        Collections.sort(list,new StringCompator());

        //判断全是0的情况
        if (list.get(0).equals("0")){
            return "0";
        }
        for (int i = 0; i < len; i++) {
            str.append(list.get(i));
        }
        return str.toString();
    }
}
class StringCompator implements Comparator<String> {

    @Override
    public int compare(String str1, String str2) {
        String str1AndStr2 = str1+str2;
        String str2AndStr1 = str2+str1;
        return str2AndStr1.compareTo(str1AndStr2);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值