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。哦,是的,我忽略了这一部分。你的方法足够好和整洁。你也可以使用递归函数来实现目标,但可能需要更多的时间。你也可以将数组拆分为等长的不同数组,按升序排序,然后通过比较模来重新组合它们。