379. 将数组重新排序以构造最小值

描述

给定一个整数数组,请将其重新排序,以构造最小值。

注意事项

The result may be very large, so you need to return a string instead of an integer.

样例

给定 [3, 32, 321],通过将数组重新排序,可构造 6 个可能性数字:

3+32+321=332321
3+321+32=332132
32+3+321=323321
32+321+3=323213
321+3+32=321332
321+32+3=321323

其中,最小值为 321323,所以,将数组重新排序后,该数组变为 [321, 32, 3]

挑战

在原数组上完成,不使用额外空间。

思路

重写 compare 方法

代码

public class Solution {
    /**
     * @param nums n non-negative integer array
     * @return a string
     */
    public String minNumber(int[] nums) {
        int n = nums.length;
        if (n < 1) {
            return "";
        }
        
        String[] strs = new String[n];
        for (int i = 0; i < n; i++) {
            strs[i] = String.valueOf(nums[i]);
        }
        
        Arrays.sort(strs, new Cmp());
        
        String ans = "";
        // 从大到小排列后,要求最小数必须从末尾开始取值拼接
        for (int i = n - 1; i >= 0; i--) {
            ans = ans.concat(strs[i]);
        }
        
        // 输入数字一部分为 0 的情况
        int i = 0;
        while (i < n && ans.charAt(i) == '0') {
            i++;
        }

        // 输入数字全部为 0 的情况
        if (i == n) {
            return "0";
        }
        return ans.substring(i);
    }
}

// 重写排序方法,如果 ba 大于 ab 则交换 a b 顺序,排序为从大到小排列
class Cmp implements Comparator<String>{
    @Override
    public int compare(String a, String b) {
        String ab = a.concat(b);
        String ba = b.concat(a);
        return ba.compareTo(ab);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,270评论 0 4
  • 1 初级排序算法 排序算法关注的主要是重新排列数组元素,其中每个元素都有一个主键。排序算法是将所有元素主键按某种方...
    深度沉迷学习阅读 1,453评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,969评论 19 139
  • linker command failed with exit code 1 (use -v to see inv...
    冬日的太阳_c107阅读 473评论 0 0
  • 作者:温馨万家不到万不得已,夏天我是不愿意逛街的。顶着毒花花的大太阳,又热又累又要花钱,哪有窝在空调屋里舒服!可有...
    魏喜梅wxm阅读 447评论 3 1