179. 最大数_面试题45. 把数组排成最小的数

本文介绍了一种用于重新排列非负整数数组的排序算法,以形成最大和最小的可能数值。通过将整数转换为字符串并自定义排序规则,确保组合后的数字能够达到最值。该算法适用于超出整数最大限制的情况,通过字符串比较来确定正确的顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

179. 最大数

问题

给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。

需要去掉前导0

例子

在这里插入图片描述

思路

考虑使用排序法则【要输出最大的值】:(10,2)->210-102
因为可能数字要大于Integer.MAX_VALUE,所以使用字符串比较

代码

class Solution {
    public String largestNumber(int[] nums) {
        
//         List<String> list = new ArrayList<>();
//         for(int n:nums)
//             list.add(String.valueOf(n));
        
//         list.sort((s1,s2)->{
//             String s = s1+s2;
//             String ss=s2+s1;
//             return ss.compareTo(s);
//         });
        
//         StringBuilder sb = new StringBuilder();
//         for(String s:list)
//             sb.append(s);
//         if(sb.charAt(0)=='0') return "0";
//         return sb.toString();
        
        String[] arr=new String[nums.length];
        for(int i=0; i<nums.length; i++)
            arr[i]=String.valueOf(nums[i]);
        
        Arrays.sort(arr, (s1,s2)->{
            String s=s1+s2;
            String ss=s2+s1;
               //使用Integer比较可能会超过最大长度,所以采用字符串比较
            // return Integer.valueOf(ss)-Integer.valueOf(s);
            return ss.compareTo(s);
        });
        
        String res = String.join("", arr);
        //如果第一个是0,则肯定后面都是0,因为res是最大的
        if(res.charAt(0)=='0') return "0";
        return res;
    }
}

面试题45. 把数组排成最小的数

不用处理前导0

class Solution {
    public String minNumber(int[] nums) {
        List<String> list = new ArrayList<>();
        
        for(int n : nums) list.add(String.valueOf(n));
        
        list.sort((s1,s2)->{
            String s = s1+s2;
            String ss = s2+s1;
            return s.compareTo(ss);
        });
        
        
        StringBuilder sb = new StringBuilder();
        for(String s : list) sb.append(s);
        
        return sb.toString();
            
        

    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值