1、题目名称
Largest Number(求整型数组中各元素可拼合成的最大数字)
2、题目地址
https://leetcode.com/problems/largest-number/
3、题目内容
英文:Given a list of non negative integers, arrange them such that they form the largest number.
中文:给出一组非负整数,求这些非负整数可以拼接出的最大数字
说明:例如,给出数组 [3, 30, 34, 5, 9],拼接出的最大数字为9534330
4、解题方法
由于本题输入是一个整型数组,输出是一个字符串,因此在输出前,可以考虑对数组进行一下排序。
下面是一段WA(Wrong Answer)的Java代码,先将数组转换成一个字符串数组,再按照字符串的大小进行排序
import java.util.Arrays;
import java.util.Collections;
/**
* 功能说明:LeetCode 179 - Largest Number
* 开发人员:Tsybius2014
* 开发时间:2015年8月8日
*/
public class Solution {
/**
* 最大的数字
* @param nums 数组
* @return
*/
public String largestNumber(int[] nums) {
String[] array = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
array[i] = String.valueOf(nums[i]);
}
Arrays.sort(array, Collections.reverseOrder());
return String.join("", array);
}
}
这个排序方法并不能按照题目要求正确排序。例如,数字8和883,如果按照字符串顺序排序,883大于8,就会把883放在前面,8放在后面,最后输出8838。而实际8883才是正确结果。正确的排序方法,是使用排序方法进行比较时,比较两个字符串(设为A和B),以先后顺序拼接而成的两个字符串A+B和B+A,如果A+B更大,则A在前B在后,否则A在后B在前。
一段可以AC(Accept)的Java代码如下:
/**
* 功能说明:LeetCode 179 - Largest Number
* 开发人员:Tsybius2014
* 开发时间:2015年8月8日
*/
public class Solution {
/**
* 最大的数字
* @param nums 数组
* @return
*/
public String largestNumber(int[] nums) {
String[] array = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
array[i] = String.valueOf(nums[i]);
}
String temp;
for (int i = 0; i < array.length; i++) {
for (int j = i + 1; j < array.length; j++) {
if ((array[i] + array[j]).compareTo(array[j] + array[i]) < 0) {
temp = array[i];
array[i] = array[j];
array[j] =temp;
}
}
}
if (array[0].equals("0")) {
return "0";
} else {
return String.join("", array);
}
}
}
END
原文:http://my.oschina.net/Tsybius2014/blog/489530