• 单调递增的数字


    单调递增的数字

    题目:
    给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。

    (当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)

    示例 1:

    输入: N = 10
    输出: 9
    示例 2:

    输入: N = 1234
    输出: 1234
    示例 3:

    输入: N = 332
    输出: 299

    解题思路:先找到从第一位开始最长的单调递增子数组,然后依次从最后一位满足要求的数字开始递减,直到满足递增要求后,将后面的数字全置为9就是最大小于N的单调递增的数字

    class Solution {
        public int monotoneIncreasingDigits(int N) {
            if(N == 10) {
                return 9;
            } 
            
            if(N < 10) {
                return N;
            }
            
            char ch[] = ("" + N).toCharArray();
            int len = ch.length;
            
            // 找到第一个非递增的数字
            int i = 1;
            while(i < len && ch[i - 1] <= ch[i]) {
                i++;
            }
            
            // 判断数字每一位是否都满足单调递增
            if(i < len) {
                
                // 当前数字不满足单调递增,那么就让其减一
                // 因为 0 -> i - 1 是单调递增的 那么只要保证 ch[i - 1] <= ch[i] 即可
                // 不断循环 直到ch[i - 1] <= ch[i] 之后将ch[i] -> ch[len - 1] 置为9后 
                // 就是小于N的最大整数
                while(i > 0 && ch[i - 1] > ch[i]) {
                    // 因为 要求的是小于N的最大整数 所以要让ch[i - 1]-- 来保证数字小于N
                    ch[i - 1]--;
                    i--;
                }
                
                for(i = i + 1; i < len; i++) {
                    ch[i] = '9';
                }
                
            }
            
            return Integer.parseInt(new String(ch));
        }
    }
    
  • 相关阅读:
    软件工程 团队开发(2)
    软件工程 团队开发(1)
    大道至简阅读笔记01
    小工具集合用户模板和用户场景
    人月神话阅读笔记03
    人月神话阅读笔记02
    本周java学习
    本周学习总结
    本周java 学习进度报告
    《构建之法》读后感
  • 原文地址:https://www.cnblogs.com/katoMegumi/p/14137686.html
Copyright © 2020-2023  润新知