package test.com;
import java.util.Arrays;
/**
* @program: Aglorithm
* @Date: today
* @Author: Kyrie
* @Description:
* 给出一个正整数,找出这个正整数所有数字全排列的下一个数。
* 简言之,找到一个大于且仅大于原数的新整数。
*/
public class Code07_FindNum {
/**
* 给定一个数,经过全排列后,从大于该数的数字中,找出最小的数。
*/
public static int findNum(int num){
String str = Integer.toString(num);
char[] arrs = str.toCharArray();
Arrays.sort(arrs);
String arrsSort = new String(arrs);
StringBuilder sb = new StringBuilder(arrsSort).reverse();
int max = Integer.parseInt(sb.toString());
arrs = Integer.toString(num).toCharArray();
if(max == num){
return 0;
}
int index = -1; //定义逆序的区域
for (int i = arrs.length -1; i > 1 ; i--) {
if(arrs[i] < arrs[i-1]){
continue;
}
index = i; //逆序区域的临界点
break;
}
//若相等,必存在有序
if(index == arrs.length - 1){
swap(arrs, index, index-1);
return Integer.parseInt(new String(arrs));
}
int high; //index前的一个高位索引
if(index - 1 >= 0){
high = index - 1;
//System.out.println(high);
for (int i = index; i < arrs.length ; i++) {
if(arrs[i] > arrs[high])
continue;
index = i;
//System.out.println(index);
break;
}
swap(arrs, index-1, high);
Arrays.sort(arrs,high+1, arrs.length);
return Integer.parseInt(new String(arrs));
}
return 0;
}
public static void swap(char[] arr, int i, int j){
char tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public static void main(String[] args) {
int num = 23541;
System.out.println(num);
System.out.println(findNum(num)); //24135
int num2 = 246521;
System.out.println(num2);
System.out.println(findNum(num2)); //251246
int num3 = 12354;
System.out.println(num3);
System.out.println(findNum(num3)); //12453
}
}
寻找全排列的下一个数
最新推荐文章于 2022-04-16 10:09:13 发布