前言
本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
题目:
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
题解
继续来打卡,每日一题,中等题,看完题目!我确定我没看错,这个题为啥是中等呢!那我的思路很简单呀,来个数组把所有值存起来,一把sort排序,然后倒着输出不就行了!那么就这样干!
public String largestNumber(int[] nums) {
StringBuilder stringBuilder = new StringBuilder();
for (int num : nums) {
stringBuilder.append(num);
}
char[] chars = stringBuilder.toString().toCharArray();
Arrays.sort(chars);
StringBuilder st = new StringBuilder();
int size = chars.length;
for (int i = size - 1; i >= 0; i--) {
st.append(chars[i]);
}
return st.toString();
}
这不出来了吗,测试跑一下自信提交!然后!!!如图:
what!!!!还是太天真了呀,话说这题出bug了吗,我的结果9543330难道是小于9534330的吗?为啥这个预期结果是9534330呀呀呀!!!!!!这不是求最大值吗?看了半天原来是题目说的每个数不能拆分!我把34拆分成43了所以不对!!!
那不拆分岂不更好写直接sort呀 再来!
public String largestNumber(int[] nums) {
int n = nums.length;
String word[] = new String[n];
for(int i=0;i<n;i++){
word[i] = String.valueOf(nums[i]);
}
Arrays.sort(word);
StringBuilder st = new StringBuilder();
int size = word.length;
for (int i = size - 1; i >= 0; i--) {
st.append(word[i]);
}
return st.toString();
}
提交结果如图:还是错的!!!!
这个问题出现在3和30按我的排序,30是大于3的,倒着输出就是303,但是结果3放在前面后面放30结果是330,那么330是比303大的,所以倒着输出是不对的,需要找到其他方法拼接两个数判断结果303和330哪个大就先放哪个!
那么就用compareTo()方法比较,compareTo是按照ASCII码逐位比较的,通过比较(3+30)和(30+3)的大小,判断出3,30两个字符串谁应该在前面!那么再修改!
AC代码
public String largestNumber(int[] nums) {
int n = nums.length;
String word[] = new String[n];
for(int i=0;i<n;i++){
word[i] = String.valueOf(nums[i]);
}
//compareTo()比较的时候是按照ASCII码逐位比较
//所以[3,30]排序后变为[3,30]
Arrays.sort(word,(a,b)->{
return (b+a).compareTo(a+b);
});
//如果排序后的第一个元素是0,那后面的元素肯定小于或等于0 是0或者负数,则可直接返回0
if(word[0].equals("0")){
return "0";
}
StringBuilder sb = new StringBuilder();
for(int i=0;i<n;i++){
sb.append(word[i]);
}
return sb.toString();
}
总结
读题认真点!请你认真点!这个题不能用sort谁用谁知道!!!