Leetcode:179. 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.

 

解法:

这道题我一开始的思路是想利用桶排序,将每个数字的最高位识别出来并将该原始数字放入相应索引的桶中(桶编号从0到9)。然后从高位桶9遍历到低位桶0,遍历每个桶的时候对里面的数字“从大到小”排序,然后依次输出,最后串成最终结果。但是这个方法不能走通,根本原因是如果遇到30,3,34这样的一组数字,排序后的结果是34,30,3。输出的最终结果就会是34303,但是期望的输出顺序应该是34,3,30。造成这个现象的根本原因是“原始从大到小的数字串依次串接后的数字未必就大于非有序数字串接而成的数字”。换句话说,在这个算法里的“从大到小”的意义,不是指的单个数字之间的大小关系,而是每个数字与其他数字拼接后的大小关系。例如,3 < 30, 按理排序结果应该是[30, 3]。但是因为303 < 330, 所以排序后的结果应该是[3, 30]。

如果按照这个算法重构排序逻辑,上面的解题思路是可以解决本题的。但是换个角度想,如果我们能够重构比较逻辑,那么其实也根本不需要桶排序了。直接把这个数字串里的各个数字之间比较一轮即可。代码如下:

// Copy from:https://leetcode.com/problems/largest-number/discuss/485294/very-Simple-sort-solution-java
public static String largestNumber(int[] nums) {
		String[] s_nums = new String[nums.length];
	    StringBuilder sb = new StringBuilder();
	    for(int i=0;i<nums.length;i++) s_nums[i] = String.valueOf(nums[i]); // convert each value to string
	    Arrays.sort(s_nums,(a,b) -> {
//	    	System.out.println((b+a) + " VS " + (a+b) + " = " + (b+a).compareTo(a+b) );
	    	return (b+a).compareTo(a+b) ;}); // sort the values 
	    if(s_nums[0].charAt(0) == '0') return "0"; // to pass the test case with multiple zeros 
	    for(String s: s_nums) sb.append(s); 
	    return sb.toString();
	}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yexianyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值