输出第一个比当前大的数
问题描述:输入整数n,输出第一个比它大的数,数字由给定整数中的数字组成。如1234,输出1243;如1243,输出1324
阶梯思想:
1.从右往左找到第一个逆序,即低数字位比高数字位大,记该高位为i 2.从i右边所有低位中找到比i位大的第一个数 3.后边所有数字增序排列
代码实现:
public class NextNum { public static void main(String[] args) { // TODO Auto-generated method stub int n =3124; System.out.println(find(n)); } public static int find(int n){ char[] nc = new Integer(n).toString().toCharArray(); int l = nc.length; //1.从右往左找到第一个逆序,即低位比高位大,记该高位为i int idx = find1(nc); if(idx == -1) return n; //2.从i右边所有低位中找到比i位大的第一个数 int idx1 = find2(nc, idx); //交换idx和idx1 char tmp = nc[idx]; nc[idx] = nc[idx1]; nc[idx1] = tmp; //3.排序 sort(nc, idx+1, l-1); return Integer.parseInt(new String(nc)); } private static int find1(char[] nc){ int l = nc.length; for(int i = l-1; i > 0; i--){ if(nc[i] > nc[i-1]) return i-1; } return -1; } //第一个大于idx对应值 private static int find2(char[] nc, int idx){ int minSub = Integer.MAX_VALUE; int idx1 = 0; for(int i = idx+1; i < nc.length; i++){ int sub = nc[i] - nc[idx]; if(sub > 0 && minSub > sub){ minSub = sub; idx1 = i; } } return idx1; } //冒泡排序,都是从start开始 private static void sort(char[] nc, int start, int end){ for(int i = start; i < end; i++){ for(int j = start; j < end; j++){ if(nc[j] > nc[j+1]){ char tmp = nc[j]; nc[j] = nc[j+1]; nc[j+1] = tmp; } } } } }
输出:3142
这是水木竹水的博客