單調遞增的數字
阿新 • • 發佈:2020-12-15
單調遞增的數字
題目:
給定一個非負整數 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)); } }