【LeetCode每日一题】最大数
最大数
1、题目描述
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2]
输出:"210"
示例 2:
输入:nums = [3,30,34,5,9]
输出:"9534330"
示例 3:
输入:nums = [1]
输出:"1"
示例 4:
输入:nums = [10]
输出:"10"
2、算法描述
思想:
想尽办法让头部数字大的放在前面,如果头部数字一样的话,那么久比较A+B和B+A组合后的数字大小
若A+B大的话,A在前B在后,反之B在前,A在后
具体实现:
1、从第一个数字开始排序,找首位数字最大的数字排在最前面。
2、如果发现A和B的首字母相等,比较A+B和B+A的大小,若A+B大的话,A在前B在后,反之B在前,A在后
3、数组排序后,用一个StringBuffer接收,然后字符串的方式输出。
4、考虑特殊情况,可能会出现"00","000".....等等,结果为0,但是首位是0,此时我们就把0返回回去就行
3、具体实现
class Solution {
public String largestNumber(int[] nums) {
nums = this.sort(nums);
StringBuffer s = new StringBuffer();
for (int num:nums) {
s.append(num);
}
if (s.length() >=2 && s.charAt(0) == '0') {
return "0";
} else {
return s.toString();
}
}
public int[] sort(int[] nums) {
int temp;
for (int i=0;i<nums.length-1;i++) {
String self = nums[i] + "";
for (int j=i+1;j<nums.length;j++) {
String next = nums[j] + "";
if (self.charAt(0) < next.charAt(0)) {
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
self = nums[i] + "";
}
if (self.charAt(0) == next.charAt(0)) {
if (Long.parseLong(self + next) < Long.parseLong(next + self)) {
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
self = nums[i] + "";
}
}
}
}
return nums;
}
}