2021-04-12 LeetCode每日一题最大数(字符串拼接排序)

该博客介绍了一种解题思路,即如何通过重写Java的Collections.sort方法,对非负整数数组进行排序,以形成最大的整数。文章以给定数组[3,30,34,5,9]为例,详细解释了解题过程,包括比较字符串的自定义排序函数,最终将排序后的字符串连接成最大整数'9534330'。

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

题目

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数
例如 输入:nums = [3,30,34,5,9] 输出:“9534330”

解题思路

Java中Collections.sort方法可以对对象数组排序,可以重写排序方法,类似于C++自己写sort的cmp函数,重写排序方法,就要对两个字符串a和b比较拼接后的大小,容易发现a+b和b+a长度是一样的,如果a+b是大于b+a的,就要把a+b放在前面,例如"3"和"30"拼接,330是大于303的,所以在字符串数组中,"3"要放在"30"前面,重点就在于sort方法里的排序器怎么写,其实很简单,直接上代码。

解题代码

class Solution {
	//避免给出的nums数组全是0,例如给了nums是{0,0},我们返回了00,而实际上应该返回0
	//有这个测试样例
    private boolean onlyZero(int[] nums) {
		for(int i : nums) {
			if(i!=0) {
				return false;
			}
		}
		return true;
	}
	//比较字符串a和b代表的数的大小,实际上我们只用到a和b等长的情况,因为o1+o2与o2+o1一定等长
	//前面判断字符串长度在本题多余
	private boolean compareStr(String a,String b) {
		if(a.length() > b.length()) {
			return true;
		}else if(a.length()<b.length()) {
			return false;
		}else {
			for(int i = 0; i < a.length();i++) {
				if(a.charAt(i) > b.charAt(i)) {
					return true;
				}else if(a.charAt(i) < b.charAt(i)) {
					return false;
				}
			}
			return false;
		}
	}
	public String largestNumber(int[] nums) {
	//如果数组中全是0则返回0,排除这种情况。
		if(onlyZero(nums)) {
			return "0";
		}
		List<String> numStr = new ArrayList<>();
		for(int num : nums) {
			numStr.add(Integer.toString(num));
		}
		Collections.sort(numStr,new Comparator<String>() {
		//重点是这里重写比较方法,如果o1+o2代表的整数值比o2+o1大,就把o1放在o2前面,反之后面。
			@Override
			public int compare(String o1, String o2) {
				if(compareStr(o1+o2,o2+o1)) {
					return -1;
				}else {
					return 1;
				}
			}
		});
		//此时数组已经按照拼接最大顺序排序,直接拼接成字符串即可。
		StringBuilder sb = new StringBuilder();
		for(String s:numStr) {
			sb.append(s);
		}
		return sb.toString();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值