一、题目
给定任意一个自然数,获取它重新排列后,下一个比它大的自然数,要求时间复杂度O(n)。例如:
给定1233,它的下一个是1323;
给定1323,它的下一个是1332;
这是一道面试题,不理解的可以去研究一下字典序算法。
二、代码
public class Test2 { public static void main(String[] args) { int a=443854489; String result=renew(a); System.out.println(result); } public static String renew(int a) { String aString=String.valueOf(a); String[] arr=aString.split(""); int[] arr2=new int[arr.length]; for(int i=0;i<arr.length;i++) { arr2[i]=Integer.parseInt(arr[i]); } //num为交换的位置 int num=0; for(int i=arr2.length-1;i>0;i--) { if(arr2[i]>arr2[i-1]) { num=i; break; } if(i==1) { return "它的下一个不存在"; } } //交换位置右边的数刚好大于它前一位交换位置 for(int i=arr2.length-1;i>=num;i--) { if(arr2[num-1]<arr2[i]) { int temp=arr2[num-1]; arr2[num-1]=arr2[i]; arr2[i]=temp; break; } } //对num右边的数进行排序,由于第一次找num时就保证了右边比左边小,所以只需要倒序一下就好了 for(int i=num,j=arr2.length-1;i<j;i++,j--) { int temp=arr2[i]; arr2[i]=arr2[j]; arr2[j]=temp; } String result=""; for (int i : arr2) { result=result+i; } return "它的下一个是"+result; } }