179. 最大数

该博客介绍了一个算法问题,即如何重新排列非负整数数组以得到最大的整数值。通过创建自定义比较器并使用Java的排序函数,可以解决这个问题。排序时,比较字符串形式的数字,如果前缀相同则比较后续部分,确保长串排在前面。最后,移除所有前导零以得到合法的最大数字符串。

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

题目描述

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

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

样例

示例 1:
输入:nums = [10,2]
输出:“210”

示例 2:
输入:nums = [3,30,34,5,9]
输出:“9534330”

示例 3:
输入:nums = [1]
输出:“1”

示例 4:
输入:nums = [10]
输出:“10”

思路

将数组元素按照某种规则排序,最后再拼起来就行啦~

对于任意两个元素串 A 和 B,依次对它们对应位置的字符进行笔记,如果发现在位置 i 的字符不同,那么就把大的放在前面,本次比较就结束了。
如果一个串是另一个串的前缀,比如 123 和 12345 ,这时就需要进行递归比较,把长串的剩余部分与短串继续进行比较,对于上面的例子,就是把 123 和 45 进行比较,由于 1 < 4,所以第一轮递归时就可以将12345排在123前面。

排序调用 java 的 sort 函数就行啦,但是规则需要自己定义~

另外需要注意的是,最后结果的字符串可能是00000…xxxxxx,这里有很多前导0,对于输出来说是非法的,所以要去除一下前导0,只要找到第一个非0字符,然后从它开始输出就行啦~

代码

public class Solution {
    public String largestNumber(int[] nums) {
    	//字符串数组
    	String sNums[] = new String[nums.length];
    	for(int i = 0;i < nums.length;i++)
    		sNums[i] = String.valueOf(nums[i]);
    	//比较类对象
    	Comparator cmp = new MyComparator();
    	Arrays.sort(sNums,cmp);
    	//存结果
    	StringBuilder s = new StringBuilder("");
    	for(int i = 0;i < sNums.length;i++)
    		s.append(sNums[i]);
    	int flag = -1;
    	for(int i = 0;i < s.length();i++) {
    		if(s.charAt(i) != '0') {
    			flag = i;
    			break;
    		}
    	}
    	//全是0
    	if(flag == -1)
    		return "0";
    	else
    		return s.substring(flag,s.length());
    }
    

}

class MyComparator implements Comparator<String>{
	@Override
	public int compare(String o1, String o2) {
		// TODO 自动生成的方法存根
		int len1 = o1.length();
		int len2 = o2.length();
		for(int i = 0;i < Math.min(len1, len2);i++) {
			if(o1.charAt(i) != o2.charAt(i)) {
				int tmp = (o2.charAt(i) -'0') - (o1.charAt(i) - '0');
				return tmp;
			}
		}
		//前缀都一样,那将短串和长串剩余部分继续比较
		if(len1 > len2) {
			return compare(o1.substring(len2, len1),o2);
		}
		else if(len2 > len1) {
			return compare(o1,o2.substring(len1,len2));
		}
		else {
			return 0;
		}
		
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值