179. Largest Number-medium

最开始的思路:

把所有数,按照位数最长的数的位数来补齐(补上的数即是该数的首位)
例如:
最长位数为5,则9补齐后是“99999”, 32补齐后是“32333”

按照补齐后的数的大小来排序,做组合

以上解法是找规律得出的

解决的特殊情况:
“121”和”12”,补足后,都是121,此例中应选12+121
0, 0
8308, 830,此例中应选8308+830

问题是:上述思路,无法解决”121”和”12”、“8308”和“830”的问题,找不到一个什么规律来选择。

public class Solution {
    /*
    把所有数,按照位数最长的数的位数来补齐(补上的数即是该数的首位)
    例如:
    最长位数为5,则9补齐后是“99999”, 32补齐后是“32333”

    按照补齐后的数的大小来排序,做组合

    以上解法是找规律得出的

    解决的特殊情况:
    "121"和"12",补足后,都是121,此例中应选12+121
    0, 0
    8308, 830,此例中应选8308+830
    */
    public String expand(String origin, int len){
        StringBuilder sb = new StringBuilder();
        sb.append(origin);
        for (int i = 0; i < len - origin.length(); i ++){
            sb.append(origin.charAt(0));
        }
        return sb.toString();
    }

    public class Number implements Comparable<Number>{
        public String number;
        public String num_expand;
        public Number(int num, int len){
            this.number = String.valueOf(num);
            this.num_expand = expand(this.number, len);
        }

        @Override
        public int compareTo(Number arg0){
            int tmp = num_expand.compareTo(arg0.num_expand);
            if (tmp == 0){
                //特殊情况,如果两者相等,那就看this.number哪个短选哪个
                //e.g. "121"和"12"补足后,都是121,此例中应选12+121
                //还有更特殊的情况:8308, 830,此例中应选8308+830
                if (number.length() < arg0.number.length()){
                    tmp = 1;
                }
                if (number.length() > arg0.number.length()) {
                    tmp = -1;
                }
            }
            return tmp;
        }
    }

    public String largestNumber(int[] nums) {
        int max_num_len = 0;
        for (int num : nums){
            String tmp = String.valueOf(num);
            if (tmp.length() > max_num_len)
                max_num_len = tmp.length();
        }

        ArrayList<Number> numbers = new ArrayList<Number>();
        for (int num : nums){
            numbers.add(new Number(num, max_num_len));
        }
        Collections.sort(numbers);
        Collections.reverse(numbers);

        StringBuilder result = new StringBuilder();
        for (Number num : numbers){
            System.out.println(String.format("%s\t%s", num.number, num.num_expand));
            result.append(num.number);
        }
        String res = result.toString();
        if (res.charAt(0) == '0')
            return "0";
        else
            return res;
    }

    public static void main(String[] args){
        Solution solution = new Solution();
        String s1 = "hot";
        String s2 = "dog";
        int n = 3;
        int[] nums = {9051,5526,2264,5041,1630,5906,6787,8382,4662,4532,6804,4710,4542,2116,7219,8701,8308,957,8775,4822,396,8995,8597,2304,8902,830,8591,5828,9642,7100,3976,5565,5490,1613,5731,8052,8985,2623,6325,3723,5224,8274,4787,6310,3393,78,3288,7584,7440,5752,351,4555,7265,9959,3866,9854,2709,5817,7272,43,1014,7527,3946,4289,1272,5213,710,1603,2436,8823,5228,2581,771,3700,2109,5638,3402,3910,871,5441,6861,9556,1089,4088,2788,9632,6822,6145,5137,236,683,2869,9525,8161,8374,2439,6028,7813,6406,7519};
        String s = solution.largestNumber(nums);
        System.out.println(s);
    }
}

正确解法:

比较a和b该怎么放,直接看 ab和ba哪个大就好了

    /*
    比较a和b该怎么放,直接看 ab和ba哪个大就好了
    */

    public String largestNumber(int[] nums) {
        String[] numbers = Arrays.stream(nums).mapToObj(String::valueOf).toArray(String[]::new);

        Arrays.sort(numbers, (String s1, String s2) -> (s1.compareTo(s2)));

        StringBuilder result = new StringBuilder();
        for (int i = numbers.length - 1; i >= 0; i --){
            result.append(numbers[i]);
        }
        String res = result.toString();
        if (res.charAt(0) == '0')
            return "0";
        else
            return res;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值