输出第一个比当前大的数

问题描述:输入整数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

 

posted @ 2020-05-12 15:27  水木竹水  阅读(805)  评论(0编辑  收藏  举报