• 输出第一个比当前大的数


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

  • 相关阅读:
    Hugo搭建的博客删除文章事宜
    [GIT] Git学习笔记
    VS Code: 解决安装code-runner扩展run后无法在只读编辑器下编辑
    c/c++结构体总结
    恢复U盘做启动盘后的容量
    Manjaro安装Mysql
    win10环境下安装manjaro kde(双系统)
    IDEA设置编辑区主题
    IDEA设置主体、窗体及菜单的字体大小
    IDEA设置项目文件编码
  • 原文地址:https://www.cnblogs.com/shuimuzhushui/p/12876512.html
Copyright © 2020-2023  润新知