Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数组中的最小数_Java_Algorithm - Fatal编程技术网

Java 数组中的最小数

Java 数组中的最小数,java,algorithm,Java,Algorithm,这是我的挑战: 给定一个非负整数列表,以尽可能少的方式排列它们 结果将非常大,因此以字符串的形式返回结果 如果将输入数组看作{ 20, 1, 5 },则所有排列如下: 2015年,2051120515205201年,但由于1205年是最小的,因此它应该是结果 输入数组{20,1,5} 结果:1205 以下是方法签名: private String getSmallestNumber(Integer[] nums) { } 我应该使用什么算法 就以下问题提出的类似问题: 我已经完成了我的代码

这是我的挑战:

给定一个非负整数列表,以尽可能少的方式排列它们

结果将非常大,因此以字符串的形式返回结果

如果将输入数组看作{ 20, 1, 5 },则所有排列如下:

2015年,2051120515205201年,但由于1205年是最小的,因此它应该是结果

输入数组{20,1,5}

结果:1205

以下是方法签名:

private String getSmallestNumber(Integer[] nums) { 

}
我应该使用什么算法

就以下问题提出的类似问题:


我已经完成了我的代码,但请向我推荐更好的算法

private String getSmallestNumber(Integer[] nums) {

    String[] arr = new String[nums.length];
    for (int i = 0; i < nums.length; i++) {
        arr[i] = String.valueOf(nums[i]);
    }

    Arrays.sort(arr, new Comparator<String>() {
        @Override
        public int compare(String a, String b) {
            return (a + b).compareTo(b + a);
        }
    });

    StringBuilder sb = new StringBuilder();
    for (String s : arr) {
        sb.append(s);
    }

    while (sb.charAt(0) == '0' && sb.length() > 1) {
        sb.deleteCharAt(0);
    }
    return sb.toString();
}
私有字符串getSmallestNumber(整数[]nums){
字符串[]arr=新字符串[nums.length];
对于(int i=0;i1){
sb.deleteCharAt(0);
}
使某人返回字符串();
}

解决方案是使用一个自定义比较器对数组进行排序,该比较器逐位进行比较。换句话说,给定两个数字,比较第一个数字的最高有效位与第二个数字的最高有效位。然后比较第二个数字,依此类推,直到到达其中一个数字的末尾,或者数字不相等。答案中带小写数字的数字排在第一位

例如,20在5之前,因为2小于5。1000在99之前,因为1小于9。123789位于1239之前,因为7小于9

所以诀窍是将较小的数字乘以10,直到两个数字的位数相同。例如,给定一个六位数字和一个四位数字,如

123789
  1239
您需要将四位数乘以100,以便两个数字的位数相同

123789
123900
然后一个简单的整数比较告诉您123789在1239之前。比较器的代码如下所示

int compare( int a, int b )
{
    int special = b - a;  // special case, e.g. 123 and 123000

    if ( a <= b ) {
        for ( int n = 1; n <= b; n *= 10 )
            if ( n > a )
                a *= 10;
    } else {
        for ( int n = 1; n <= a; n *= 10 )
            if ( n > b )
                b *= 10;
    }

    if ( a == b )
        return special;
    else
        return a - b;
}
int比较(int a,int b)
{
int special=b-a;//特殊情况,例如123和123000

如果(a我知道这可能是家庭作业,但提示甚至不清楚。我对数组进行排序并覆盖Comparator。我不知道是否正确理解了您的问题。如果您只是按升序排序数组并打印它,这不是最小的数字吗?它不是对数组排序,而是将2个整数a+B和B+a串联起来如果你有一个数组{9,4,2,5,1},你可以做的最小整数是12459,这与按升序排序数组是一样的。至少这就是我从你所举的例子中所能理解的。如果有一个简单的方法来达到这个目标,那么总是使用它。如果你排序,{ 1, 5, 20 },把输入看作{ 20, 1, 5 }。如果整数1520不正确,则正确的解是{1,20,5}这将是1205。哦,是的,我忽略了这一部分。你的方法足够好和整洁。你也可以使用递归函数来实现目标,但可能需要更多的时间。你也可以将数组拆分为等长的不同数组,按升序排序,然后通过比较模来重新组合它们。