寻找全排列的下一个数

    xiaoxiao2022-07-12  152

    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 } }
    最新回复(0)