题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
我的思想
-
找出数组所有的拼接数字
-
从这些拼接数字中找出最小的一个
另一种思路
-
新建一个比较的方法,依次传入数组中的两个元素进行比较,
-
通过比较这两个元素的组合数的大小,得出两个元素的前后顺序比如3和32进行比较,二者分别组合成332和323,所以32的位置在3的前面
-
同时再传入数组的下一个元素,直到所有元素都比较完
-
把新数组的所有元素拼接到一起即可
-
这种方法仿佛是一种特殊的排序,可以采用八大排序算法对齐进行处理
-
只是排序的规则不是简单的比较大小,而是比较的他们拼接数的大小
-
需要注意:如果提供的数字太大,可能会超出int的范围,此时改用long即可
int的取值范围为(-2147483648~2147483647),占用4个字节(-2的31次方到2的31次方-1)
long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-2的63次方到2的63次方-1)
public String PrintMinNumber(int[] numbers) {
if (numbers == null || numbers.length == 0) {
return "数组不存在或数组长度为0";
}
boolean flag = false;
for (int i = 0; i < numbers.length; i++) {
for (int j = 0; j < numbers.length - 1 - i; j++) {
flag = BubbleSort(numbers[j], numbers[j + 1]);
if (flag) {
numbers[j] = numbers[j] ^ numbers[j + 1];
numbers[j + 1] = numbers[j] ^ numbers[j + 1];
numbers[j] = numbers[j] ^ numbers[j + 1];
}
flag = false;
}
}
StringBuilder result = new StringBuilder();
for (int number : numbers) {
result.append(number);
}
return result.toString();
}
private static boolean BubbleSort(int a, int b) {
String str1 = "" + a + b;
String str2 = "" + b + a;
long a1 = Long.parseLong(str1);
Long b1 = Long.parseLong(str2);
// int a1 = Integer.parseInt(str1);
// int b1 = Integer.parseInt(str2);
if (a1 > b1) {
return true;
}
return false;
}