给定一个正整数,找到由相同数字组成的下一个更大的数字。如1234输入1243,1243输入1342
参考代码:
public class Test {
public static void main(String[] args) {
System.out.println(big(63543));
System.out.println(big(78234569));
System.out.println(big(12543));
System.out.println(big(94653));
System.out.println(big(1243));
System.out.println(big(432));
}
private static int big(int num) {
// 计算数字的长度,用于创建数组
int len = String.valueOf(num).length();
if (len <= 1) {
return -1;
}
int[] arr = new int[len];
// 将num拆分为一个个数字,放在数组中
int i = len - 1;
while (num > 0) {
arr[i] = num % 10;
num /= 10;
i--;
}
// 找出从后往前数连续递增的最大的数字的下标
// 比如 1243 则找到4的下标, 94653 则找到6的下标
int maxIndex = 0;
for (int j = len - 1; j > 1; j--) {
if (arr[j - 1] < arr[j]) {
maxIndex = j;
break;
}
}
// 如果找到的下标为0,说明当前数字已经是最大了,不能更大
// 比如 4321,已经是最大了
if (maxIndex == 0) {
return -1;
}
// maxIndex - 1 表示maxIndex的前一个数,这个数要和其他数做交换
// 以得到下一个更大的数字
// 比如 1243,我们只要让 4 前面的数字 2 与 3交换,即可得到下一个最大的数字
// 94653 则让 6 前面的 4 与 5 交换,得到95643,即可下一个最大的数字
int b = maxIndex - 1;
int minIndex = maxIndex;
// 循环找到大于 maxIndex - 1 的数字 且在 [maxIndex, len)这个区间内的最小数字
for (int j = len - 1; j >= maxIndex; j--) {
if (arr[b] < arr[j] && arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 交换
int temp = arr[b];
arr[b] = arr[minIndex];
arr[minIndex] = temp;
// 将数组的数字组合成一个int
int big = 0;
for (int j = 0; j < len; j++) {
big = big * 10 + arr[j];
}
return big;
}
}
思考:如果输入的数字可以为负数,要怎么写?