1. 程式人生 > 實用技巧 >單調遞增的數字

單調遞增的數字

單調遞增的數字

題目:
給定一個非負整數 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));
    }
}