题目描述 :
- 最大数
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2]
输出:“210”
示例 2:
输入:nums = [3,30,34,5,9]
输出:“9534330”
示例 3:
输入:nums = [1]
输出:“1”
示例 4:
输入:nums = [10]
输出:“10”
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 10^9
友情提醒,正确解法可以考虑去leetcode看下题解,下面这个过于暴力且拉...(不推荐)
思路 :
又是一条路走到黑的一天。。。。粗暴的按照比较器和递归写了下,先判断两字符串的长度 ,如果相同直接按照String直接去比就可,否则的话,按照两者的长度关系进行递归,递归的时候默认按照s0>s1
来写的 ,导致可能会出现传入字符串相反导致结果问题 ,在这种情况下需要将递归返回的结果取它的相反数。
暴力解的后续 :元素就这么几个也会直接 java.lang.StackOverflowError
。。
emo…的后续 ,还是去看了看别人的题解 ,没去写了(…)
代码 :
class Solution {
public String largestNumber(int[] nums) {
if (nums.length == 0){
return null;
}
ArrayList<String> list = new ArrayList<>();
for (int num : nums) {
list.add(Integer.toString(num));
}
Object[] arr = list.toArray();
Arrays.sort(arr, (o0, o1) -> {
String s0 = o0.toString();
String s1 = o1.toString();
int len0 = s0.length();
int len1 = s1.length();
int len = Math.min(len0,len1);
if (len0 == len1 || !(s0.substring(0,len).equals(s1.substring(0,len)))) {
return s0.compareTo(s1);
}
if (len0 > len1) {
return f(len0, len1, s0, s1, len);
}else {
return -f(len1, len0, s1, s0, len);
}
});
StringBuilder sb = new StringBuilder(arr.length);
for (int i = arr.length - 1; i >= 0; i--) {
sb.append(arr[i]);
}
String s = sb.toString();
if (s.charAt(0) == '0'){
return "0";
}
return s;
}
public static int f(int len0, int len1, String s0, String s1, int index) {
int t = Math.min(len0 - index, len1);
int res;
if ((res = s0.substring(index,index + t).compareTo(s1.substring(0,t))) == 0) {
if (t < len1){
return -f(len1,t,s1,s0.substring(index),0);
}
return f(len0, len1, s0, s1, index + t);
} else return res;
}
}
运行结果 :
当时测试案例卡过的地方貌似也没出啥问题
拿对数器去比对过,应该没啥问题...吧.......( 元素少亿点的情况