2.给定任意一个自然数,获取它重新排列后,下一个比它大的自然数,要求时间复杂度O(n)。例如: 给定1233,它的下一个是1323; 给定1323,它的下一个是1332

一、题目

给定任意一个自然数,获取它重新排列后,下一个比它大的自然数,要求时间复杂度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;
		
	}
}

三、总结

更多精彩欢迎关注:

猜你喜欢

转载自blog.csdn.net/jiankang66/article/details/90641226
今日推荐