最大数|刷题打卡

143 阅读2分钟

前言

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

题目:

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

image.png

题解

继续来打卡,每日一题,中等题,看完题目!我确定我没看错,这个题为啥是中等呢!那我的思路很简单呀,来个数组把所有值存起来,一把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();
    }

这不出来了吗,测试跑一下自信提交!然后!!!如图:

image.png 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();
    }

提交结果如图:还是错的!!!! image.png 这个问题出现在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谁用谁知道!!!