leetcode题解179-最大数

问题描述

给定一组非负整数 nums,重新排列它们每个数字的顺序(每个数字不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例 1:

输入:nums = [10,2]
输出:"210"

示例 2:

输入:nums = [3,30,34,5,9]
输出:"9534330"

示例 3:

输入:nums = [1]
输出:"1"

示例 4:

输入:nums = [10]
输出:"10"

提示:

1 <= nums.length <= 100
0 <= nums[i] <= 109

解题思路:

此题求拼接起来的最大数字,本质上是一个排序问题。设数组 nums中任意两数字的字符串为x 和y ,
则规定排序判断规则为:
  若拼接字符串x+y>y+x,则x大于y,我们可以把x放在前面
  否则,y大于x,我们可以把x放在后面
一旦数组排好了序,最“重要/大”的数字会在最前面
有一个需要注意的情况是如果数组只包含 0 ,我们直接返回结果 0 即可。
否则,我们用排好序的数组形成一个字符串并返回。

实现代码

class Solution {
    
    
    public String largestNumber(int[] nums) {
    
    
        int n=nums.length;
        /*
        因为Java提供的比较器的参数必须是对象类型,所以这里需要把nums数组中的元素值
        都复制Integer中
        */
        Integer onums[]=new Integer[n];
        for(int i=0;i<n;i++){
    
    
            onums[i]=nums[i];
        }
        /*
        此题求拼接起来的最大数字,本质上是一个排序问题。设数组 nums中任意两数字的字符串为x 和y ,
        则规定排序判断规则为:
        若拼接字符串x+y>y+x,则x大于y,我们可以把x放在前面
        否则,y大于x,我们可以把x放在后面。
        一旦数组排好了序,最“重要/大”的数字会在最前面。
        */
        Arrays.sort(onums,new Comparator<Integer>(){
    
    
            public int compare(Integer x,Integer y){
    
    
                String sx=String.valueOf(x);        //将数值转换为字符串
                String sy=String.valueOf(y);
                String xy=sx+sy;
                String yx=sy+sx;
                int n=xy.length();
                //比较xy和yx的大小,从高位逐位进行比较。如果都一样大,返回0。如果xy大,返回-1,否则返回1
                for(int i=0;i<n;i++){
    
    
                    int a=xy.charAt(i)-'0';
                    int b=yx.charAt(i)-'0';
                    if(a>b){
    
    
                        return -1;
                    }else if(a<b){
    
    
                        return 1;
                    }else{
    
    
                        continue;
                    }
                }
                return 0;
            }
        });
        int j;
        /*
        有一个需要注意的情况是如果数组只包含 0 ,我们直接返回结果 0 即可。
        否则,我们用排好序的数组形成一个字符串并返回。
        */
        for(j=0;j<n;j++){
    
    
            if(onums[j]!=0){
    
    
                break;
            }
        }
        if(j==n){
    
    
            return "0";
        }
        //使用stringbuffer能提高效率
        StringBuffer sb=new StringBuffer();
        //从前往后添加最“大”的数
        for(int i=0;i<n;i++){
    
    
            sb.append(String.valueOf(onums[i]));
        }
        //返回值是String类型
        return sb.toString();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39736597/article/details/114487930